java - 使用 forkJoinPool 时如何在未捕获的 Java 异常消息中显示堆栈跟踪

标签 java exception stack-trace

当我在 recursiveTask 的实例中有一个未捕获的异常时(来自 forkJoinPool )。 JVM 打印一行错误消息告诉我异常的类型,

XXX.XXX.XXXXXXException

但没有堆栈跟踪。通过一些测试,我意识到当 forkJoinPool 中存在 只有一个 的 recursiveTask 实例时(即通过将链接中示例中的 sThreshold 设置得足够大),始终打印堆栈跟踪;存在多个 实例,没有堆栈跟踪。问题是,我怎样才能始终获得堆栈跟踪?

跟进:

尝试使用 forkJoinPool 的第三个构造函数

private static final ForkJoinPool threadPool = 
new ForkJoinPool(Runtime.getRuntime().availableProcessors(), 
defaultForkJoinWorkerThreadFactory, 
new ExceptionHandler(), false);

ExceptionHandler 类:

final class ExceptionHandler implements Thread.UncaughtExceptionHandler {

    ExceptionHandler() {
    }

    @Override
    public void uncaughtException(Thread t, Throwable err) {
        System.err.println("Uncaught " + err + " in thread " + t);
        err.printStackTrace();
    }
}

池被调用。

threadPool.invoke(new aForkJoinTask());
...
threadPool.invoke(new differentForkJoinTask());

我放入的 RecursiveAction 中的某处

int i = Integer.parseInt("word");

但是,以下内容作为错误消息打印

java.lang.NumberFormatException

与此同时,主线程中相同的未捕获异常会打印堆栈跟踪。

最佳答案

虽然我没有尝试过,但在我看来,您可以使用以下 constructor :

ForkJoinPool(int parallelism, ForkJoinPool.ForkJoinWorkerThreadFactory factory, Thread.UncaughtExceptionHandler handler, boolean asyncMode)

它提供了一个选项来声明内部工作线程的处理程序,这些线程由于在执行任务时遇到不可恢复的错误而终止。

关于java - 使用 forkJoinPool 时如何在未捕获的 Java 异常消息中显示堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32323989/

相关文章:

go - 我可以从 panic 中恢复过来,处理错误,然后再次 panic 并保留原始堆栈跟踪吗?

java - 以本地用户启动Tomcat导致JVM_Bind异常

java - 我想将 Eclipse 控制台日志保存到字符串中

postgresql - Postgres 异常

java - 仅来 self 的包的 Spring Boot 堆栈跟踪日志记录过滤器

java - "Software caused connection abort: socket write error"的官方原因

java - asmack - 接收自定义 XML 消息 ||

java - 如何在 JScrollPane 中添加 JPanel,然后再次添加 JPanel?

java - RC4 算法的 KeyGenerator 异常

php - PHP 7 中 Error 和 ErrorException 的区别