interrupt
作用
1.对运行中的线程,仅设置了一个停止的标记,但程序照常运行。 2.对阻塞中的线程,该线程会抛出InterruptedException异常。
interrupt
方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。
interrupt
方法只能打上一个停止标记(改变状态),不能终止一个正在运行的线程,还需要加入一个判断才停止线程。
interrupt方法的使用效果并不像 for break 语句那样,马上就停止循环。 调用interrupt方法是在当前线程中打了一个停止标志,并不是真的停止线程。
三个主要API 1.interrupt() :中间当前线程,实际并不是马上执行; 2.interrupted(): 获取前线程的interrupt状态,关置重置interrupt状态为false,即未打interrupt状态 ; 3.isInterrupted(): 获取前线程的interrupt状态,不重置;
看个小例子,子线程中断自己
代码语言:javascript复制/**
* 主动中断线程
*/
public class MyThread extends Thread {
@Override
public void run(){
super.run();
try {
for(int i=0; i<5000; i ){
if (i == 100) {
System.out.println("主动中断线程");
Thread.currentThread().interrupt();
}
System.out.println("i=" (i 1));
Thread.sleep(100);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Run {
public static void main(String args[]){
Thread thread = new MyThread();
thread.start();
}
}
效果
代码语言:javascript复制i=99
i=100 //这里调用了,但是并没有马上中断
主动中断线程
i=101
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.liukai.algorithm.practise.tree.MyThread.run(MyThread.java:18)
interrupted 判断当前线程状态
工作步骤:
- 检测当前线程是否被中断,是: 返回true,否: 返回false,
- 如果被中断,返回true,同时清除中断标志,即重置中断标志为false。
public class Test1 {
public static void main(String[] args) {
test();
}
public static void test() {
try {
TestThread testThread = new TestThread();
System.out.println("start");
testThread.start();
testThread.sleep(1000);
testThread.interrupted();
System.out.println("是否中断1 " testThread.isInterrupted());
System.out.println("是否中断2 " testThread.isInterrupted());
} catch (InterruptedException e) {
System.out.println("main catch");
e.printStackTrace();
}
System.out.println("end");
}
}
class TestThread extends Thread{
}
看下如何重置状态
代码语言:javascript复制public static boolean interrupted() {
// 实际上就是通 isInterrupted 为 true
return currentThread().isInterrupted(true);
}