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

时间:2017-08-08 14:46:58

标签: java completable-future

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

这将在调用cf.complete()的线程中完成BiConsumer回调时运行

从另一个线程调用commonPool()时,如何在当前线程(cf.complete()?)中没有完成/其他lambda时运行此命令?

1 个答案:

答案 0 :(得分:2)

您无法在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池的线程中运行代码。