CompletableFuture实现异步获取结果并且等待所有异步任务完成
直接上代码:
import com.google.common.collect.Lists; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.List; import java.util.concurrent.*; import java.util.function.BiConsumer; /** * CompletableFuture的AllOf功能测试,等待所有任务执行完 * */ public class CompletableFutureAllOfTest { public static void main(String[] args) throws Exception { ThreadPoolExecutor executor = new ThreadPoolExecutor(4, 4, 100L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(10)); method1(executor); method2(executor); method3(executor); } /** * 拆解写法 * @param executor */ public static void method1 (ExecutorService executor) { long start = System.currentTimeMillis(); // 定义第一个任务 CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } return "cf1"; }, executor); cf1.whenComplete(new BiConsumer<String, Throwable>() { @Override public void accept(String t, Throwable u) { System.out.println("hello " + t); } }); // 定义第二个任务 CompletableFuture<String> cf2 = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } return "cf2"; }, executor); cf2.whenComplete(new BiConsumer<String, Throwable>() { @Override public void accept(String t, Throwable u) { System.out.println("hello " + t); } }); // 开始等待所有任务执行完成 CompletableFuture<Void> all = CompletableFuture.allOf(cf1, cf2); System.out.println("start block"); all.join(); System.out.println("block finish, consume time:" + (System.currentTimeMillis() - start)); } /** * 合并写法 * @param executor */ public static void method2 (ExecutorService executor) { List<String> testList = Lists.newArrayList(); testList.add("cf1"); testList.add("cf2"); long start = System.currentTimeMillis(); CompletableFuture<Void> all = null; for (String str : testList) { // 定义任务 CompletableFuture<String> cf = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } return str; }, executor); cf.whenComplete(new BiConsumer<String, Throwable>() { @Override public void accept(String t, Throwable u) { System.out.println("hello " + t); } }); all = CompletableFuture.allOf(cf); } System.out.println("start block"); // 开始等待所有任务执行完成 all.join(); System.out.println("block finish, consume time:" + (System.currentTimeMillis() - start)); } /** * 通过Java8的stream实现,非常简洁 * @param executor */ @SuppressWarnings("rawtypes") public static void method3 (ExecutorService executor) { List<String> testList = Lists.newArrayList(); testList.add("cf1"); testList.add("cf2"); long start = System.currentTimeMillis(); CompletableFuture[] cfArr = testList.stream(). map(t -> CompletableFuture .supplyAsync(() -> pause(t), executor) .whenComplete((result, th) -> { System.out.println("hello" + result); })).toArray(CompletableFuture[]::new); // 开始等待所有任务执行完成 System.out.println("start block"); CompletableFuture.allOf(cfArr).join(); System.out.println("block finish, consume time:" + (System.currentTimeMillis() - start)); } public static String pause (String name) { try { Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } return name; } }
参考: CompletableFuture实现异步获取结果并且等待所有异步任务完成
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义