如何在其他线程中将 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 池线程中的代码。
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 池线程中的代码。