我对在CompletableFuture中定义执行程序感到困惑。我不确定如何告诉CompletableFuture在该特定执行程序中运行它。预先感谢。
//Suppose I have an executor
ExecutorService myExecutor=Executors.newFixedThreadPool(2);
//If I create a future like this
CompletableFuture.runAsync(() -> {
//Do something
}, myExecutor); // I can put the executor here and say the future to this executor
//But I do not know where to put executor if I create my future in method style like this
private final CompletableFuture<Void> myMethod(String something) {
//Do something
return null;
}
//and use it like this
.thenCompose(this::myMethod); //How can I specify the executor in this case?
答案 0 :(得分:1)
您可以执行以下操作:
ExecutorService es = Executors.newFixedThreadPool(4);
List<Runnable> tasks = getTasks();
CompletableFuture<?>[] futures = tasks.stream()
.map(task -> CompletableFuture.runAsync(task, es))
.toArray(CompletableFuture[]::new);
CompletableFuture.allOf(futures).join();
es.shutdown();
答案 1 :(得分:0)
在您的示例中,您有3个CompletableFuture
在玩:
runAsync()
返回的那个myMethod()
返回的那个thenCompose()
返回的那个您还有4个任务需要运行:
runAsync()
的那个将在给定的执行器上执行并处理将来的1; myMethod()
调用thenCompose()
来创建Future 2的那个程序可以在任何执行程序上运行,使用thenComposeAsync()
明确选择一个; myMethod()
返回的未来2的人–它将在myMethod()
本身内部进行控制; thenCompose()
返回的Future 3的那个–由内部处理,并且取决于执行顺序(例如,如果myMethod()
返回一个已经完成的Future,它也会完成前一个)。 如您所见,涉及多个任务和执行程序,但是您始终可以使用*Async()
变体来控制在依赖阶段使用的执行程序。您唯一无法真正控制它的情况是第4种情况,但是只要相关阶段也使用*Async()
变体,它就很便宜。