CompletableFuture 和 thenAccept lambda 函数未在主线程中执行

CompletableFuture and thenAccept lambda functions not executing in the main Thread

在 Java 中使用 CompletableFuture,我意识到在 CompletableFuture 上使用 thenAccept 或其他同步方法在本网站中记录的下一个方法中非常棘手:https://mobiarch.wordpress.com/2018/09/07/understanding-java-completablefuture/。我逐字引用:

对于像 thenAccept 这样的非异步方法,事情就没那么简单了。 Java 使用此策略: 如果调用 thenAccept() 的 future 在调用之前已经完成,那么将在调用 thenAccept() 的同一线程中调用 lambda。 如果调用 thenAccept() 时 future 尚未完成,则将在 future 完成的同一线程中调用 lambda。在我们的例子中,这将是来自默认 ForkJoinPool 的线程”。 基本上,非异步方法会尽量避免任何不必要的线程切换。这具有更少的 CPU 开销并且工作速度更快。但是如果 lambda 需要很长时间才能完成,我们就有可能阻塞主线程。

我认为这是一个非常意外的行为,没有很好的记录并且很棘手,因为我为 运行 一个异步任务创建了一些 CompletableFuture 以便 return 从中获取一些东西并等待这个任务完成使用 thenAccept 并使用 lambda 函数将结果 return 发送给客户端。但是 lambda 函数没有在主线程中执行,导致 return 一些默认值给客户端而不是计算值。

谢谢

答案很简单,讲的也比较多

如果您想要确定性您的操作在哪个线程中执行,请使用thenApplyAsync/thenAcceptAsync/etc.

的版本