java之线程中断——interrupt
如下图所示,interrupt()方法并没有成功的中断我们的线程。![](https://img2018.cnblogs.com/blog/1365945/201908/1365945-20190820132903358-1307325069.png)
![](https://img2018.cnblogs.com/blog/1365945/201908/1365945-20190820132903358-1307325069.png)
为了便于理解,其实可以这样来类比(注意,只是类比,实际情况并不完全是这样):Thread类中有一个boolean的标志域用来表示线程是否需要被中断,默认是false。interrupt()方法被调用之后,这个标志域就变成了true。当然,Thread类有一个interrupted()方法返回一个boolean值,返回的就是这个标志域的值。也就是说,其实interrupt()方法除了把这个标志域设定为true之后,其他什么也没干了。这就解释了上例中的线程为什么不能被正确地中断。
将循环改变为这种方式
再运行测试程序,就会发现,2秒后线程会停止打印,它确实是被中断了。
![](https://img2018.cnblogs.com/blog/1365945/201908/1365945-20190820132928343-1608566007.png)
有时候,我们不仅仅想要中断一个像上面这样重复着做同一件事的线程。很多情况下,我们需要的是中断一个休眠中的线程。毕竟开始因为某种需要,让一个线程休眠一段很长的时间,后来你就后悔了,想中断它的休眠。这个时候,interrupt()方法就又有用武之地了。
这里是我们常用的几种场景(阻塞都会被打断):
1.wait(会输出somebody bothered me.)![](https://img2018.cnblogs.com/blog/1365945/201908/1365945-20190820133012289-1844697474.png)
![](https://img2018.cnblogs.com/blog/1365945/201908/1365945-20190820133012289-1844697474.png)
2.sleep(会输出somebody bothered me.)![](https://img2018.cnblogs.com/blog/1365945/201908/1365945-20190820133023820-984266694.png)
![](https://img2018.cnblogs.com/blog/1365945/201908/1365945-20190820133023820-984266694.png)
![](https://img2018.cnblogs.com/blog/1365945/201908/1365945-20190820133033726-30460752.png)