gpt4 book ai didi

java - ThreadPoolExecutor 间歇性地允许未捕获的异常进入主线程

转载 作者:行者123 更新时间:2023-12-01 10:01:51 24 4
gpt4 key购买 nike

在我提供给自定义 ThreadPoolExecutor 的 Runnable 任务中,我捕获任何 Throwable。然后我没有抛出相同的异常,而是抛出一个自定义的 RuntimeException。我在执行器中重写了 afterExecute(Runnable runnable, Throwable throwable) 方法,并且正如预期的那样,该异常在执行后可供我使用。我的理解是,除此之外,任何事情都不应该发生,因为我已经小心处理它了。但是,间歇性地允许异常传递到主线程,然后使用 Thread.getUncaughtExceptionHandler() 将其打印到 System.err。我通过将以下内容放入应用程序的主要方法中来验证这一点:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.err.println("I shouldn't have got here!");
}
});

现在我可以轻松地在上面的代码中执行任何操作,并阻止输出到 System.err,但我宁愿弄清楚为什么 ThreadPoolExecutor 让异常从我给它的任务中逃脱。对于为什么会发生这种情况有什么想法吗?

最佳答案

ThreadPoolExecutor 捕获并重新抛出任务异常:

try {
task.run();
} catch (RuntimeException x) {
thrown = x; throw x;
} catch (Error x) {
thrown = x; throw x;
} catch (Throwable x) {
thrown = x; throw new Error(x);
} finally {
afterExecute(task, thrown);
}

因此异常无论如何都会由默认处理程序处理。

如果你想避免调用默认处理程序,那么你可以使用 FutureTask 包装你的 Runnable,它在内部维护异常,或者创建自己的包装器以便能够在适当的位置处理异常。

关于java - ThreadPoolExecutor 间歇性地允许未捕获的异常进入主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36750780/

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