下面是我使用CompletableFuture编写的代码-
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
printResult();
return "complete future!";
});
在上面的代码中,在printResult函数中,我使用一些与xerces相关的类进行身份验证,这使我找不到SAX2驱动程序类错误!
但是,当我使用Callable编写相同的代码时,它工作正常-
Callable<String> callableFuture = () -> {
printResult();
return "callable!";
};
此外,在CompletableFuture之外,printResult()也可以正常工作。只是想知道这里是否有人知道这里出了什么问题。感谢您的帮助!
编辑::我在日志中进行了一些挖掘,这是实际的错误消息- {ForkJoinPool.commonPool-worker-2} | [---] |错误:找不到SAX2驱动程序类org.apache.xerces.parsers.SAXParser
答案 0 :(得分:1)
Callable
只是一个接口(以及@FunctionalInterface
也是如此),它不假定任何有关上下文的信息。
CompletableFuture::supplyAsync(Supplier<U> supplier)
与它的文档不同:
返回一个新的CompletableFuture,它由在
ForkJoinPool.commonPool()
中运行的任务以调用给定的Supplier所获得的值异步完成。
因此,根据您的情况,您得到的错误(“找不到SAX2驱动程序错误!”)是由于从printResult()
执行CompletableFuture
时,SAX2引起的驱动程序尚未加载。