java-8 - CompletableFuture 具有异步运行的可变长度 Runnable 任务

标签 java-8

据我所知,目前缺少以下 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());

如果这些 future 没有返回任何结果,而您只是想等待完成,则可以使用

CompletableFuture<?> f = CompletableFuture.allOf(emails.stream()
    .map(s -> CompletableFuture.runAsync(new SendEmailTask(s)))
    .toArray(CompletableFuture<?>[]::new));

CompletableFuture 将在所有作业完成后完成,如果任何任务失败,它将异常完成。但是,如果多个任务失败,您将只能检查其中一个异常。

关于java-8 - CompletableFuture 具有异步运行的可变长度 Runnable 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49026141/

相关文章:

java - 为什么 ForkJoinPool::invoke() 会阻塞主线程?

java - 访问空组的流时,制作基于 Java 8 groupingBy 的映射 "null safe"

java - Apple 收据验证时连接重置 (Java 8)

eclipse - 在 Eclipse Luna 中获取 "Project facet Java version 1.8 is not supported."

java - 是否可以将函数作为枚举构造函数参数?

java - 有没有一种优雅的方法来获取Java中多个方法返回的第一个非空值?

java - 绑定(bind)着色器 - LWJGL 对象的不正确纹理

java - Tomcat 7 注释扫描器和带有 -parameters 编译器标志异常的 JDK 8

java - 流与集合

Java将for循环转换为lambda表达式