interrupt()方法

其作用是中断此线程(此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行。

结论:

对一个线程,调用 interrupt() 时,
  ① 如果线程处于被阻塞状态(例如处于sleep, wait, join 等状态),那么线程将立即退出被阻塞状态,并抛出InterruptedException异常。仅此而已。
  ② 如果线程处于正常活动状态,那么会将该线程的中断标志设置为 true,仅此而已。被设置中断标志的线程将继续正常运行,不受影响。

也就是说,一个线程如果有被中断的需求,那么就可以这样做。
  ① 在正常运行任务时,经常检查本线程的中断标志位,如果被设置了中断标志就自行停止线程。
  ② 在调用阻塞方法时正确处理InterruptedException异常。(例如,catch异常后就结束线程。)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
29
class MyThreadTest {
public static void main(String[] args) throws InterruptedException {
MyThread thread = new MyThread();
thread.start();
System.out.println(thread.isInterrupted());
thread.interrupt(); // 仅仅只是把标志位变为true
System.out.println(thread.isInterrupted());
Thread.sleep(1000);
System.out.println(thread.isInterrupted());
}

}

class MyThread extends Thread {
@Override
public void run() {

for (; ; ) {

if (Thread.currentThread().isInterrupted()) {
System.out.println("BBBBB");
break;
}

}

}

}

执行结果:

1
2
3
4
false
true
BBBBB
false

你在main线程中调用了interrupt()他只是通知了MyThread线程需要停止,也就是吧它的中断标志位改为true,MyThread线程并没有真的停止,此时你的main线程拿到了cpu所以后续输出了true,当你调用Thread.sleep(1000)之后MyThread线程拿到cpu,执行到了for循环进入if然后breank并且清除MyThread的标志位,所以当main得到cpu之后输出false

stop(); 暴力停止,不建议使用