java - Java中的线程中断

标签 java multithreading interruption

我想澄清一下线程中断。

如果线程长时间不调用抛出 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;
    }
}

当我调用方法 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) {
        ...
}

最佳答案

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

  1. 该线程的中断标志已设置。
  2. 如果线程在抛出 InterruptedException 的方法中被阻塞,该方法将立即抛出异常。

如果线程忙于某些抛出InterruptedException的代码,您将不会得到任何异常。这就是为什么您需要检查 if (Thread.interrupted()),以检查标志。

在您的示例代码中,Java 编译器会提示 catch block 无效,因为 try block 中的所有代码都不会抛出 InterruptedException

关于java - Java中的线程中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22356082/

相关文章:

java - MapStruct 根据目标类型映射正确的对象实例

multithreading - foreach循环上的多线程?

java - 异步多线程: Error compiling shader. (libgdx)

c - 如何用C语言为时钟为16MHz的ATMega8计算时间

java - 线程在过载流量下如何以及为何被中断

java - 等待/通知和等待/中断有什么区别?

Java - gz 存档作为八位字节流下载

Java,正确使用等待和通知来暂停另一个线程的线程执行

Java正则表达式

c# - 将任务与 ASP.NET 一起使用