来自Callable的CompletableFuture?

die*_*n07 11 java concurrency java.util.concurrent java-8

今天我尝试了CompletableFutureJava 8中的"new" ,当我找不到runAsync(Callable)方法时发现自己很困惑.我可以自己做,如下图所示,但为什么这(对我来说非常明显和有用的实用方法)缺失?上午失去了一些东西?

public static <T> CompletableFuture<T> asFuture(Callable<? extends T> callable, Executor executor) {
    CompletableFuture<T> future = new CompletableFuture<>();
    executor.execute(() -> {
        try {
            future.complete(callable.call());
        } catch (Throwable t) {
            future.completeExceptionally(t);
        }
    });
    return future;
}
Run Code Online (Sandbox Code Playgroud)

Zho*_*gYu 6

你应该使用 supplyAsync(Supplier<U>)

通常,lambda和受检查的异常不能很好地协同工作,并且CompletableFuture通过设计避免了受检查的异常。虽然在您的情况下应该没有问题。

相关线程:

http://cs.oswego.edu/pipermail/concurrency-interest/2012-December/010486.html

http://cs.oswego.edu/pipermail/concurrency-interest/2014-August/012911.html

  • 这对我来说似乎更加不一致。因为是,它_does_允许您使用“ whenComplete”处理异常。但是您只能通过打破流利的样式并使用自己的静态帮助器方法(然后调用“ completeExceptionally”)来将异常“引入”过程。阅读代码确实很丑陋。 (4认同)
  • 邮件列表上对此进行了大量讨论。最后,我对Doug Lea并不信服,并且发现整个过程对程序员不友好。我最终制作了自己的[Async](http://bayou.io/release/0.9/javadoc/bayou/async/Async.html)接口。 (4认同)