interrupt()方法
其作用是中断此线程(此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行。
结论:
对一个线程,调用 interrupt() 时,
① 如果线程处于被阻塞状态(例如处于sleep, wait, join 等状态),那么线程将立即退出被阻塞状态,并抛出InterruptedException异常。仅此而已。
② 如果线程处于正常活动状态,那么会将该线程的中断标志设置为 true,仅此而已。被设置中断标志的线程将继续正常运行,不受影响。
也就是说,一个线程如果有被中断的需求,那么就可以这样做。
① 在正常运行任务时,经常检查本线程的中断标志位,如果被设置了中断标志就自行停止线程。
② 在调用阻塞方法时正确处理InterruptedException异常。(例如,catch异常后就结束线程。)interrupt() 并不能真正的中断线程,需要被调用的线程自己进行配合才行。
示例:
1 | class MyThreadTest { |
执行结果:
1 | false |
你在main线程中调用了interrupt()他只是通知了MyThread线程需要停止,也就是吧它的中断标志位改为true,MyThread线程并没有真的停止,此时你的main线程拿到了cpu所以后续输出了true,当你调用Thread.sleep(1000)之后MyThread线程拿到cpu,执行到了for循环进入if然后breank并且清除MyThread的标志位,所以当main得到cpu之后输出false
stop(); 暴力停止,不建议使用