中断是对线程的一个指示,它应该停止正在做的事情并做其他事情。由程序员决定线程如何响应中断,但是线程终止是很常见的。这是本节课要强调的用法。
线程通过在要被中断的线程对象上调用interrupt来发送中断。为了让中断机制正常工作,被中断的线程必须支持自己的中断。
Supporting Interruption
线程如何支持自己的中断?这取决于它当前正在做什么。如果线程频繁地调用抛出InterruptedException的方法,它只需在捕获该异常后从run方法返回。例如,假设SleepMessages示例中的中心消息循环在线程的Runnable对象的run方法中。那么它可能会被修改如下以支持中断:
代码语言:javascript复制for (int i = 0; i < importantInfo.length; i ) {
// Pause for 4 seconds
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
// We've been interrupted: no more messages.
return;
}
// Print a message
System.out.println(importantInfo[i]);
}
许多抛出InterruptedException的方法(如sleep)被设计成取消当前操作,并在接收到中断时立即返回。
如果线程很长时间没有调用抛出InterruptedException的方法,该怎么办?然后,它必须定期调用Thread.interrupted,如果已经接收到中断,该函数返回true。例如:
代码语言:javascript复制for (int i = 0; i < inputs.length; i ) {
heavyCrunch(inputs[i]);
if (Thread.interrupted()) {
// We've been interrupted: no more crunching.
return;
}
}
在这个简单的示例中,代码只是测试中断并在收到中断后退出线程。在更复杂的应用程序中,抛出InterruptedException可能更有意义:
代码语言:javascript复制if (Thread.interrupted()) {
throw new InterruptedException();
}
这允许中断处理代码集中在catch子句中。
中断状态标志
中断机制是使用一个内部标志来实现的,这个标志被称为中断状态。调用Thread.interrupt设置这个标志。当线程通过调用静态方法thread .interrupted来检查中断时,中断状态将被清除。一个线程使用非静态的isInterrupted方法来查询另一个线程的中断状态,它不会改变中断状态标志。