当我在 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/