与某些博客(例如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/