与某些博客(例如I can't emphasize this enough: thenAccept()/thenRun() methods do not block)中所述不同,CompletableFuture.thenAccept确实可以阻止。考虑以下代码,取消注释pause方法调用将导致thenAccept阻塞:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    log.trace("return 42");
    return "42";
});

//pause(1000); //uncommenting this will cause blocking of thenAccept

future.thenAccept((dbl -> {
    log.trace("blocking");
    pause(500);
    log.debug("Result: " + dbl);
}));

log.trace("end");
pause(1000);

我们可以确定以下内容不会被阻止吗?据我了解,如果supplyAsync立即运行,那么thenAccept可能会阻止,不是吗?
CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
    return "42";
}).thenAccept((dbl -> {
    pause(500);
    log.debug("Result: " + dbl);
}));

最佳答案

没错,如果将来已经完成,thenAccept()将被阻止。还要注意,如果不是这种情况,它将导致完成它的线程在完成时阻塞。

这就是为什么要使用 thenAcceptAsync() ,它将以非阻塞方式运行Consumer的原因:

CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
    return "42";
}).thenAcceptAsync((dbl -> {
    pause(500);
    log.debug("Result: " + dbl);
}));

另请参阅Which executor is used when composing Java CompletableFutures?

关于java - CompletableFuture.thenAccept确实可以阻止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43933920/

10-09 07:42