CompletableFuture,可变长度的Runnable任务以异步方式运行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CompletableFuture,可变长度的Runnable任务以异步方式运行相关的知识,希望对你有一定的参考价值。

据我所知,现在缺少以下api:

CompletableFuture future = null;
List<String> emails = ...
for(String email: emails) {
    future = future.runAsync(new SendEmailTask(email));
}

要么

List<CompletableFuture> runAsync(List<Runnable> tasks);

当我看到它的文档或教程时,感觉用户需要知道有多少任务,并相应地“静态地”编码。所以我仍然使用executors.invokeAll作为可变长度的任务列表。有没有办法使用CompletableFuture来做到这一点?

答案

如果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将完成,如果任何任务失败,将完成特殊工作。但是,如果多个任务失败,您将只能检查其中一个例外。

以上是关于CompletableFuture,可变长度的Runnable任务以异步方式运行的主要内容,如果未能解决你的问题,请参考以下文章

java中的CompletableFuture的实现异步操作的基本介绍

Java 我在学反射的时候,遇到可变长度参数列表,具体的成员方法就是?

Java可变长度参数

可变长度整数的编码

可变长度的字符

Java实现长度可变数组