据我所知,现在缺少以下api:
CompletableFuture future = null;
List<String> emails = ...
for(String email: emails) {
future = future.runAsync(new SendEmailTask(email));
}
或
List<CompletableFuture> runAsync(List<Runnable> tasks);
当我看到它的文档或教程时,感觉用户需要知道有多少任务,并且静态编码&#39;因此。所以我仍然使用executors.invokeAll
来表示可变长度的任务列表。有没有方法可以使用CompletableFuture
来执行此操作?
答案 0 :(得分:2)
如果SendEmailTask
确实属于Runnable
,则无法将其列表传递给ExecutorService.invokeAll
,您需要进行转化。执行此操作所需的代码与使用CompletableFuture
执行此操作的代码没有显着差异:
ExecutorService es = …
List<Future<Object>> list = es.invokeAll(emails.stream()
.map(s -> Executors.callable(new SendEmailTask(s)))
.collect(Collectors.toList()));
List<Future<Void>> list = emails.stream()
.map(s -> CompletableFuture.runAsync(new SendEmailTask(s)))
.collect(Collectors.toList());
如果这些期货没有返回任何结果,而您只是对等待完成感兴趣,可以使用
CompletableFuture<?> f = CompletableFuture.allOf(emails.stream()
.map(s -> CompletableFuture.runAsync(new SendEmailTask(s)))
.toArray(CompletableFuture<?>[]::new));
CompletableFuture
将在所有作业完成后完成,如果任何任务失败,将会异常完成NULL
。但是,如果多个任务失败,您将只能检查其中一个例外。