使用标志停止线程的坏处在于,如果线程正在等待或处于休眠状态,则必须等待它完成等待/休眠。如果您调用线程上的中断方法,那么这将导致等待或睡眠调用与InterruptedException一起退出。
(标志方法的第二个缺点是,大多数非平凡的代码都将使用java.util.current这样的库,其中的类是专门设计用来使用中断来取消的。在传递给Executir的任务中使用手摇标志将很尴尬。)
调用中断()还设置一个中断属性,您可以使用该属性作为标志来检查是否退出(在线程没有等待或休眠的情况下)。
您可以编写线程的Run方法,以便在线程正在执行的循环逻辑之外捕获InterruptedException,或者在循环中捕获异常并接近抛出异常的调用,为InterruptedException在CATCH块中设置中断标志,这样线程就不会忘记它被中断的事实。中断的线程仍然可以根据自己的条件保持控制和完成处理。
假设我想编写一个确实以增量方式工作的工作线程,其中由于某种原因在中间有睡眠,而且我不希望放弃睡眠以使处理退出而不为该增量执行剩余的工作,我只希望它在增量之间的情况下退出:class MyThread extends Thread{
public void run()
{
while (!Thread.currentThread().isInterrupted())
{
doFirstPartOfIncrement();
try {
Thread.sleep(10000L);
} catch (InterruptedException e) {
// restore interrupt flag
Thread.currentThread().interrupt();
}
doSecondPartOfIncrement();
}
}}