【发布时间】:2018-10-22 10:33:29
【问题描述】:
下面是我使用 CompletableFuture 编写的代码 -
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
printResult();
return "complete future!";
});
在上面的代码中,在 printResult 函数中,我使用了一些与 xerces 相关的类来进行一些身份验证,这给了我 SAX2 driver class not found 错误!
但是,当我使用 Callable 编写相同的代码时,它运行良好 -
Callable<String> callableFuture = () -> {
printResult();
return "callable!";
};
此外,printResult() 在 CompletableFuture 之外也可以正常工作。只是想知道这里是否有人知道这里出了什么问题。感谢您的帮助!
编辑:我在日志中挖掘了一下,这是实际的错误消息 - {ForkJoinPool.commonPool-worker-2} | [---] |错误:未找到 SAX2 驱动程序类 org.apache.xerces.parsers.SAXParser
【问题讨论】:
-
您如何在代码中使用
callableFuture? -
使用执行器服务 - executor.submit(callableFuture);
-
如果您为您的
CompletableFuture使用相同的执行器服务,例如CompletableFuture.supplyAsync(() -> { printResult(); return "complete future!"; }, executor),那又会怎样? -
@Holger - 我刚刚实施了你的问题/解决方案,它奏效了!非常感谢。以前我直接运行 CompletableFuture 而不使用 executor-completableFuture.get()。它在将执行程序传递给 CompletableFuture 后工作。仍然困惑为什么?
-
显然,您在
printResult()中使用的 xerces 相关类取决于调用线程。CompletableFuture的…Async…方法默认使用ForkJoinPool.commonPool(),它使用除executor之外的其他线程,这些差异似乎与此处相关。在我看来,代码不应该对实际线程有这样的依赖,然而,这样的依赖,比如使用Thread.getContextClassLoader(),实际上非常普遍……
标签: java multithreading java-8 completable-future