70、商城业务---异步---CompletableFuture---多任务组合
import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadTest { public static ExecutorService service = Executors.newFixedThreadPool(5); public static void main(String[] args) throws ExecutionException, InterruptedException { CompletableFuture<String> future01 = CompletableFuture.supplyAsync(() -> { System.out.println("查询商品的信息"); return "商品"; }, service); CompletableFuture<String> future02 = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(3000); System.out.println("查询属性"); } catch (InterruptedException e) { throw new RuntimeException(e); } return "属性"; }, service); CompletableFuture<String> future03 = CompletableFuture.supplyAsync(() -> { System.out.println("查询图片信息"); return "图片"; }, service); /** * 等待全部运行完毕 * 第一种:阻塞式等待,这样会等待执行时间最长的线程 【不推荐】 */ // future01.get(); // future02.get(); // future03.get(); /** * 等待全部运行完毕 * 第二种:使用allof()方法等待所有线程运行完毕 【推荐】 */ // CompletableFuture<Void> future = CompletableFuture.allOf(future01, future02, future03); // future.get();//等待所有线程运行完毕 // ==================================================================== /** * 等待其中一个运行完毕 */ CompletableFuture<Object> anyOf = CompletableFuture.anyOf(future01, future02, future03); anyOf.get(); System.out.println("运行结果::" + anyOf.get()); System.out.println("全部线程运行完毕"); } public static void test(String[] args) throws ExecutionException, InterruptedException { System.out.println("main-----start"); //thenRunAsync CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> { System.out.println("当前线程::" + Thread.currentThread().getId()); int i = 10/2; System.out.println("运行结果::" + i); return i; }, service).thenRunAsync(()->{ System.out.println("任务二启动了"); },service); //thenAcceptAsync CompletableFuture<Void> voidCompletableFuture = CompletableFuture.supplyAsync(() -> { System.out.println("当前线程::" + Thread.currentThread().getId()); int i = 10 / 2; System.out.println("运行结果::" + i); return i; }, service).thenAcceptAsync((result) -> { System.out.println("上一步的执行结果::" + result); }, service); //thenApplyAsync CompletableFuture<String> stringCompletableFuture = CompletableFuture.supplyAsync(() -> { System.out.println("当前线程::" + Thread.currentThread().getId()); int i = 10 / 2; System.out.println("运行结果::" + i); return i; }, service).thenApplyAsync((result) -> { return "hello---" + result; }, service); System.out.println(stringCompletableFuture.get()); CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> { System.out.println("任务一开始"); int i = 10 / 2; System.out.println("任务一结束"); return i; }, service); CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> { System.out.println("任务二开始"); int i = 10 / 4; System.out.println("任务二结束"); return i; }, service); //runAfterBoth:组合两个 future,不需要获取 future 的结果,只需两个 future 处理完任务后, 处理该任务。 // future1.runAfterBothAsync(future2, ()->{ // System.out.println("任务三开始"); // }, service); //thenAcceptBoth:组合两个 future,获取两个 future 任务的返回结果,然后处理任务,没有 返回值 // future1.thenAcceptBothAsync(future2, (res1, res2)->{ // System.out.println("任务三开始"); // System.out.println("任务一的返回值::" + res1); // System.out.println("任务二的返回值::" + res2); // System.out.println("任务三结束"); // }, service); //thenCombine:组合两个 future,获取两个 future 的返回结果,并返回当前任务的返回值 CompletableFuture<String> future3 = future1.thenCombineAsync(future2, (res1, res2) -> { return res1 + "---" + res2 + "---" + "hello"; }, service); System.out.println(future3.get()); System.out.println("main-----end"); } }
分类:
谷粒商城
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
2022-02-07 java.util.ConcurrentModificationException: null