如何在不阻塞的情况下启动CompletableFuture并在完成后执行某些操作?

时间:2016-05-04 04:14:58

标签: java completable-future

CompletableFuture API相当令人生畏,很多接受,以及thens和其他东西;很难说出为什么存在不同的选择。

CompletableFuture<?> future = CompletableFuture.supplyAsync(() ->..., executor)

future.startNonBlocking...( (...) -> { callback behavior done when complete }

我基本上试图模仿new Thread(() -> dostuff).start(),但有更好的线程池,错误处理等。注意:我实际上并不需要Runnable接口,我正在整理一块现有代码。

什么是启动异步任务并在完成时执行行为的正确方法?或处理抛出的异常?

2 个答案:

答案 0 :(得分:2)

这是一个简单的异步回调:

CompletableFuture.supplyAsync(() -> [result]).thenAccept(result -> [action]);

或者如果您需要错误处理:

CompletableFuture.supplyAsync(() -> [result]).whenComplete((result, exception) -> {
    if (exception != null) {
        // handle exception
    } else {
        // handle result
    }
});

答案 1 :(得分:2)

new Thread(() -> dostuff).start()

表示 dostuff 实现 Runnable ,因此您可以使用

static CompletableFuture<Void> runAsync(Runnable runnable)    
static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor)