Java CompletableFuture分配执行器

时间:2018-09-02 18:02:07

标签: java asynchronous executorservice completable-future concurrent.futures

我对在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?

2 个答案:

答案 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在玩:

  1. runAsync()返回的那个
  2. myMethod()返回的那个
  3. thenCompose()返回的那个

您还有4个任务需要运行:

  1. 传递给runAsync()的那个将在给定的执行器上执行并处理将来的1;
  2. myMethod()调用thenCompose()来创建Future 2的那个程序可以在任何执行程序上运行,使用thenComposeAsync()明确选择一个;
  3. 将完成myMethod()返回的未来2的人–它将在myMethod()本身内部进行控制;
  4. 将完成thenCompose()返回的Future 3的那个–由内部处理,并且取决于执行顺序(例如,如果myMethod()返回一个已经完成的Future,它也会完成前一个)。

如您所见,涉及多个任务和执行程序,但是您始终可以使用*Async()变体来控制在依赖阶段使用的执行程序。您唯一无法真正控制它的情况是第4种情况,但是只要相关阶段也使用*Async()变体,它就很便宜。