- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道在 main
线程中处理 InterruptedException
的正确方法是什么。当main
线程被中断时?
我看到 join()
方法抛出 InterruptedException
,但我想知道如何清理辅助线程以正常终止。
这是示例程序:
public class Main {
public static void main(String[] args) {
Thread t = new Thread() {
public void run() {
while (true) {
if (Thread.interrupted()) {
break;
}
}
System.out.println("[thread] exiting...");
}
};
System.out.println("[main] starting the thread");
t.start();
System.out.println("[main] interrupting the secondary thread");
t.interrupt();
try {
t.join();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new RuntimeException(e);
}
System.out.println("[main] exiting");
}
}
此代码将打印以下输出:
[main] starting the thread
[main] interrupting the secondary thread
[thread] exiting...
[main] exiting
我发现互联网上的某些文章(例如 http://www.yegor256.com/2015/10/20/interrupted-exception.html )建议将 interrupt
标志设置为 true 并抛出 RuntimeException
。我不知道这将如何缓解这种情况(在退出之前清理剩余的线程)。
谢谢。
编辑:我在评论中提到的代码被剪断
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread mainThread = Thread.currentThread();
Thread t = new Thread() {
public void run() {
while (true) {
if (Thread.currentThread().isInterrupted()) {
break;
}
}
System.out.println("[thread] interrupting the main thread...");
mainThread.interrupt();
System.out.println("[thread] exiting...");
}
};
System.out.println("[main] starting the thread");
t.start();
System.out.println("[main] interrupting the secondary thread");
t.interrupt();
try {
t.join();
} catch (InterruptedException e) {
System.out.println("[main] InterruptedException indeed happened");
Thread.currentThread().interrupt();
throw e;
}
System.out.println("[main] exiting");
}
}
最佳答案
在您的示例中,没有任何内容会中断主线程,处理从辅助线程上的调用加入引发的 InterruptedException
的代码都不会被执行。所以这真的没关系。设置中断标志的目的是让该线程中执行的其他事物知道中断,以便所有事物都可以退出它正在做的事情,这不是这里关心的问题。
您可以将 main 方法包装在 try-catch
block 中,记录它捕获的所有内容。这是确保记录所有异常的正常做法。
您的代码在辅助线程上调用中断
。只要该线程被编写为通过清理和退出来响应中断,那么就没有更多的事情要做。
不要使用Thread.interrupted()
,使用Thread.currentThread().isInterrupted()
。 interrupted
方法会清除中断标志作为副作用。
捕获 InterruptedException
并抛出 RuntimeException
与 java.util.concurrent
类的编写方式不一致。让 InterruptedException
被抛出比将其包装在未经检查的异常中更惯用。
示例代码不能被信号中断,您必须通过编写自己的信号处理程序来实现该功能。
关于java - 在主线程中处理InterruptedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43522672/
我是一名优秀的程序员,十分优秀!