文档

Java™ 教程-Java Tutorials 中文版
Interrupts (中断)
Trail: Essential Classes
Lesson: Concurrency
Section: Thread Objects

Interrupts (中断)

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 的线程,总是可以立即再次设置中断状态。


Previous page: Pausing Execution with Sleep
Next page: Joins