java中的线程中断

时间:2014-03-12 15:23:11

标签: java multithreading interruption

我想要一些关于线程中断的澄清。

如果线程长时间没有调用抛出anInterruptedException的方法会怎么样?然后它必须定期调用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;
    }
}

当我调用方法Thread.interrupt()时,它会抛出中断的异常,所以我需要做if (Thread.interrupted())我会这样做

try {
    for (int i = 0; i < inputs.length; i++) {
        heavyCrunch(inputs[i]);
        if (Thread.interrupted()) {
            // We've been interrupted: no more crunching.
            return;
        }
    }
} catch (InterruptedException ex) {
        ...
}

3 个答案:

答案 0 :(得分:4)

当你在另一个线程上调用Thread.interrupt()时,会发生两件事:

  1. 该线程的中断标志已设置。
  2. 如果线程在throws InterruptedException的方法中被阻止,则该方法将立即引发异常。
  3. 如果线程忙于某些抛出InterruptedException的代码,则不会出现任何异常。这就是为什么你需要检查if (Thread.interrupted()),检查标志。

    在您的示例代码中,Java编译器会抱怨无效的catch阻止,因为try块中的所有代码都不会引发InterruptedException

答案 1 :(得分:0)

因为Thread.interrupted()as documented,根本不会抛出InterruptedException。它返回true或false,并清除调用Thread.interrupt()时设置的中断状态。请注意,Thread.interrupt()不会导致InterruptedException被抛出。它只是设置中断状态。

答案 2 :(得分:0)

在线程上调用中断不会直接导致线程抛出InterruptedException。它所做的就是为该线程设置中断标志。 sleep,wait或join等方法可以在当前线程上引用该标志,以决定是否抛出InterruptedException。

中断是合作的,被中断的线程决定它将如何响应;通过这种方式,线程可以执行它需要做的任何清理,而不会在中途被击落。

您通常应该使用Thread.isInterrupted(),因为它不会更改中断标志的值。 Thread.interrupted()重置标志:

  

此方法清除线程的中断状态。在   换句话说,如果这个方法连续两次被调用,那么   第二次调用将返回false(除非当前线程是   在第一次通话清除其中断后再次中断   状态,在第二次电话检查之前)。

虽然Thread.isInterrupted()没有:

  

测试此线程是否已被中断。中断状态   线程不受此方法的影响。

检查中断标志意味着您的线程可以检测它是否被中断而不必睡觉或等待。 Thread.isInterrupted()和Thread.interrupted()都不会抛出InterruptedException,使用它的代码会检查返回值。

此外,Thread.interrupt不会抛出InterruptedException。 (并且抛出的任何异常都将出现在调用线程中,而不是在被中断的线程中。)interrupt方法用于在另一个线程上设置中断标志。线程中断本身是没有意义的,线程可以返回。