编辑:
How to catch an Exception from a thread - 这不是重复。链接指的是直接线程(子线程),这不是这里的情况!我们谈论的是间接(孙子线程)。子线程是关闭的JAR
(我没有写访问权限)
我有以下方法:f1
我没有写入权限(这是一个已关闭的JAR
)。
f1
在新线程上创建并运行一个抛出异常的任务。
在main
方法上,我必须在新主题上调用f1
。我需要能够捕获从f1
的子线程抛出的所有异常。
换句话说,如何在不更改grandson
线程的情况下从son
线程捕获异常。
main method opens new thread and call:
|
V
f1 method opens new thread and call:
|
V
anonymous method which throws exception
示例代码:
private static void f1() {
Executors.newSingleThreadExecutor()
.submit(() -> {
try {
throw new Exception("exception from anonymous thread");
} catch (Exception e) {
e.printStackTrace();
throw e;
}
});
}
public void main() {
final Future<?> submit = Executors.newSingleThreadExecutor()
.submit(() -> f1());
try {
submit.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
答案 0 :(得分:1)
这个问题没有一般答案。在这种情况下,异常在Executor中处理。你可以做一个
捕获任务中可能发生的所有异常,并为捕获的异常返回有意义的状态
如果任务已作为Callable<?>
提交,那么如果任务已完成,则get
将返回Future<?>
ExecutionException
对于未捕获的异常,您可以在Executor使用的线程工厂上设置Uncaught Exception Handler
ThreadPoolExecutor具有afterExecute(Runnable r, Throwable t)
方法,可以处理任务中未捕获的异常