如何从间接线程中捕获异常?

时间:2018-04-09 08:13:35

标签: java multithreading exception

编辑:

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();
    }
}

1 个答案:

答案 0 :(得分:1)

这个问题没有一般答案。在这种情况下,异常在Executor中处理。你可以做一个

  • 捕获任务中可能发生的所有异常,并为捕获的异常返回有意义的状态

  • 如果任务已作为Callable<?>提交,那么如果任务已完成,则get将返回Future<?> ExecutionException

  • 对于未捕获的异常,您可以在Executor使用的线程工厂上设置Uncaught Exception Handler

  • ThreadPoolExecutor具有afterExecute(Runnable r, Throwable t)方法,可以处理任务中未捕获的异常