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

标签 java multithreading exception

<分区>

编辑:

How to catch an Exception from a thread - 这不是重复。该链接指的是直接线程(子线程),这里不是这种情况!我们正在谈论间接(孙线程)。子线程是一个封闭的JAR(我没有写入权限)


我有以下方法:f1 我没有写入权限(它是一个封闭的 JAR)。

f1 在抛出异常的新线程上创建并运行任务。 在 main 方法上,我必须在新线程上调用 f1。我需要能够捕获从 f1 的子线程抛出的所有异常。

换句话说,如何在不更改 son 线程的情况下捕获 grandson 线程的异常。

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

最佳答案

这个问题没有统一的答案。在这种情况下,异常是在 Executor 内部处理的。您可以执行以下操作之一

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

  • 如果任务提交为 Callable<?>然后 get返回时 Future<?>会抛出 ExecutionException如果任务完成但有异常

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

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

关于java - 如何从间接线程中捕获异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49728299/

相关文章:

Ruby 自定义错误类 : inheritance of the message attribute

c# - BitmapFrame.Create 异常(WPF 框架中的错误?)

java - Mockito when() 不工作

java - 尝试使用 Parse 中的对象在 Android 中填充 ListView

java - 测试客户端/服务器与应用引擎的交互

mysql - 行级锁,或者读时锁

Java多线程应用程序System.out.println产生延迟

java - 当输入只有整数和小数点部分时检查 double 值

Java Graphics : Each time it repaints, 我得到一个 blackflash

c# - 如何从 Visual Studio 中手动终止特定(正在运行的)线程