如何在其他线程中将 CompletableFuture.complete() 欺骗为 运行 dependents/stages?

How to trick CompletableFuture.complete() to run dependents/stages in other thread?

CompletableFuture<Object> cf = new CompletableFuture<>();
cf.whenComplete((t, throwable) -> {
    System.out.println(Thread.currentThread().toString());
});
cf.complete(new Object());

这将在调用 cf.complete()

的线程中 运行 whenComplete 的 BiConsumer 回调

如何 运行 这个 whenComplete/other lambda 不在当前线程中(commonPool()?),而 调用 cf.complete() 来自另一个线程?

您无法在 cd.complete() 级别执行此操作。 唯一的方法是使用

cd.whenCompleteAsync()

并传递一个执行器作为第二个参数。

所以它看起来像这样:

Executor executor = Executors.newSingleThreadExecutor();
CompletableFuture<Object> cf = new CompletableFuture<>();
cf.whenCompleteAsync((t, throwable) -> {
    System.out.println(Thread.currentThread().toString());
}, executor);
cf.complete(new Object());

编辑: 我忘了说如果你不想,你不必创建自己的执行器。您可以简单地使用没有第二个参数的 whenCompleteAsync() 。然后它将 运行 ForkJoin 池线程中的代码。