gpt4 book ai didi

java - 在主线程中处理InterruptedException

转载 作者:行者123 更新时间:2023-11-30 06:47:05 27 4
gpt4 key购买 nike

我想知道在 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 并抛出 RuntimeExceptionjava.util.concurrent 类的编写方式不一致。让 InterruptedException 被抛出比将其包装在未经检查的异常中更惯用。

示例代码不能被信号中断,您必须通过编写自己的信号处理程序来实现该功能。

关于java - 在主线程中处理InterruptedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43522672/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com