Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
interrupt (中断) 表示线程应该停止正在执行的操作并执行其他操作。由程序员决定线程如何响应中断,但线程终止是很常见的。这是本课程中强调的用法。
线程通过调用 Thread
对象上的 interrupt
来发送中断,以使线程被中断。为使中断机制正常工作,被中断的线程必须支持自己的中断。
线程如何支持自己的中断?这取决于它目前正在做什么。如果线程经常调用抛出 InterruptedException
的方法,它只需在捕获该异常后从 run
方法返回。例如,假设 SleepMessages
示例中的中央消息循环位于线程的 Runnable
对象的 run
方法中。然后可以按如下方式修改它以支持中断:
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
。例如:
for (int i = 0; i < inputs.length; i++) { heavyCrunch(inputs[i]); if (Thread.interrupted()) { // We've been interrupted: no more crunching. return; } }
在这个简单的例子中,代码只是测试中断,如果收到则退出线程。在更复杂的应用程序中,抛出 InterruptedException
可能更有意义:
if (Thread.interrupted()) { throw new InterruptedException(); }
这允许中断处理代码集中在 catch
子句中。
中断机制使用称为 interrupt status (中断状态) 的内部标志实现。调用 Thread.interrupt
设置此标志。当线程通过调用静态方法 Thread.interrupted
检查中断时,将清除中断状态。非静态 isInterrupted
方法,它是一个线程用于查询另一个线程的中断状态,不会更改中断状态标志。
按照规范,任何通过抛出 InterruptedException
退出的方法都会在执行此操作时清除中断状态。但是,通过另一个调用 interrupt
的线程,总是可以立即再次设置中断状态。