interrupt

作用

1.对运行中的线程,仅设置了一个停止的标记,但程序照常运行。
2.对阻塞中的线程,该线程会抛出InterruptedException异常。

interrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。
interrupt方法只能打上一个停止标记(改变状态),不能终止一个正在运行的线程,还需要加入一个判断才停止线程。

interrupt方法的使用效果并不像 for+break 语句那样,马上就停止循环。
调用interrupt方法是在当前线程中打了一个停止标志,并不是真的停止线程。

三个主要API
1.interrupt() :中间当前线程,实际并不是马上执行;
2.interrupted(): 获取前线程的interrupt状态,关置重置interrupt状态为false,即未打interrupt状态 ;
3.isInterrupted(): 获取前线程的interrupt状态,不重置;

看个小例子,子线程中断自己

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* 主动中断线程
*/
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();
}
}

效果

1
2
3
4
5
6
7
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 判断当前线程状态

工作步骤:

  1. 检测当前线程是否被中断,是: 返回true,否: 返回false,
  2. 如果被中断,返回true,同时清除中断标志,即重置中断标志为false。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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{
}

看下如何重置状态

1
2
3
4
public static boolean interrupted() {
// 实际上就是通 isInterrupted 为 true
return currentThread().isInterrupted(true);
}