在CompletableFuture中无法正确加载类

时间:2018-10-22 10:33:29

标签: java multithreading java-8

下面是我使用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

1 个答案:

答案 0 :(得分:1)

Callable只是一个接口(以及@FunctionalInterface也是如此),它不假定任何有关上下文的信息。

CompletableFuture::supplyAsync(Supplier<U> supplier)与它的文档不同:

  

返回一个新的CompletableFuture,它由在ForkJoinPool.commonPool()中运行的任务以调用给定的Supplier所获得的值异步完成。

因此,根据您的情况,您得到的错误(“找不到SAX2驱动程序错误!”)是由于从printResult()执行CompletableFuture时,SAX2引起的驱动程序尚未加载。