1

直接来自这个oracle 教程:

中断

中断是对线程的指示,它应该停止正在做的事情并做其他事情。由程序员决定线程如何响应中断,但线程终止是很常见的。这是本课强调的用法。

“由程序员决定..”在哪里可以对特定行为进行编程?“线程终止很常见”是否意味着标准行为会终止线程?

编辑: 例如,我们有来自 Sempaphore 类的 acquireUninterruptibly 方法,如果接收到中断,它只会延迟中断导致被中断的时间量的等待时间。可能在这种情况下,中断处理只包含一个 Thread.yield()?提前致谢。

4

3 回答 3

2

通常是 sleep 之类的方法 throws InterruptedException

如果一个线程很长时间没有调用抛出的方法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();
}

现在回答你的问题:

  1. 从上面的例子可以看出,如果InterruptedException没有被方法处理,可以自己处理
  2. 由于您可以为这些方法处理此问题,因此您可以执行其他任务而不是退出。但是在中断发生后退出线程绝对是最常见的。

来源javadoc

于 2013-06-01T09:19:11.273 回答
1

当出现问题时会发生中断(甚至存在其他情况)并且程序将切换到INTERRUPT SERVICE ROUTINE。它可能会在那里处理问题并继续执行或如果无法解决则终止。

在java中,即使是“异常”(Interrupt)我们通常也会编写这样的例程(这可能会导致中断)和catch(异常),我们在其中捕获并处理它。如果问题无法解决,我们将终止它。

于 2013-06-01T09:19:02.373 回答
0

当您设置中断时,它会设置一个标志,它比这更复杂,但这是基本行为。您通过使用一个程序点来检测中断

if(Thread.currentThread.isInterrupted())

或使用基本上可以做到这一点的功能。你不应该假设发生了一些神奇的事情。归根结底,一切都是使用代码实现的。

于 2013-06-01T09:28:31.247 回答