线程中断
interrupt方法作用是告知线程停止手头的工作转而去做别的事。通过interrupt终止线程是很常见的,不过你完全可以设定线程如何响应中断。这也是本节的重点。
调用某一线程的interrupt方法可以中断该线程。但想要中断机制正常工作,首先要得到线程支持。
支持中断
线程如何支持中断?这取决于线程当前在执行的内容。如果线程频繁调用抛出中断异常(InterruptedException)的方法,它就会在捕获异常后从run方法返回。例如,假设一个线程run方法中有一个循环,想要支持中断机制,它可以这样改:
for (int i = 0; i < importantInfo.length; i++) { // 休眠4秒 try { Thread.sleep(4000); } catch (InterruptedException e) { // 线程被中断 return; } // 打印语句 System.out.println(importantInfo[i]); }
很多方法都会抛出中断异常(InterruptedException),比如sleep方法,如果收到中断信息,就会马上中断当前操作并返回。
如果线程运行了很长时间,而且没有调用任何抛出中断异常的方法,这时候又该怎样呢?那它必须定期调用Thread.interrupted方法来判断线程是否已被中断,如果是则返回true 。例如:
for (int i = 0; i < inputs.length; i++) { heavyCrunch(inputs[i]); if (Thread.interrupted()) { // 线程被已被终止 return; } }
在这个简单的例子中,代码只是单纯地测试是否被中断,如果是,就退出。在复杂的应用程序中,最好还是抛出一个InterruptedException :
if (Thread.interrupted()) { throw new InterruptedException(); }
这样写,就把处理线程中断的代码都集中在catch语句里头了。
线程中断状态标识
线程中断机制是靠一个叫中断状态(interrupt status)的内部标识来实现的。调用了Thread.interrupt来设置该标志。如果线程调用静态方法Thread.interrupted 检查中断,中断状态(interrupt status)便被清除。但使用其他线程的非静态isInterrupted方法来查询某线程的中断状态,是不会改变该线程的中断状态标识的(interrupt status flag)。
原文:
http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html