ToB企服应用市场:ToB评测及商务社交产业平台

标题: springboot~CompletableFuture并行计算 [打印本页]

作者: 莫张周刘王    时间: 2024-5-19 05:32
标题: springboot~CompletableFuture并行计算
在Spring中,CompletableFuture通常用于异步编程,可以方便地处理异步使命的实行和效果处理,CompletableFuture 是 Java 8 引入的一个类,用于支持异步编程和并发操纵。它基于 Future 和 CompletionStage 接口,提供了丰富的方法来处理异步使命的实行和效果处理。
下面是 CompletableFuture 实现的一些关键原理:
总的来说,CompletableFuture 的实现基于 Future 和 CompletionStage 接口,使用线程池、回调函数、异常处理、组合操纵等机制,提供了强盛而灵活的异步编程功能,使得开发人员能够更加方便地处理异步使命的实行和效果处理。
使用方法(一)链式

如果我们的业务方法已经写完了,这时可以直接通过supplyAsync方法来调用这些已知的方法,而不需要重新开发
  1. CompletableFuture<String> a1 = CompletableFuture.supplyAsync(() -> {
  2.       try {
  3.           Thread.sleep(1000);
  4.       } catch (InterruptedException e) {
  5.           throw new RuntimeException(e);
  6.       }
  7.       return "Hello World";
  8.   });
  9.   CompletableFuture<String> a2 = CompletableFuture.supplyAsync(() -> {
  10.       try {
  11.           Thread.sleep(2000);
  12.       } catch (InterruptedException e) {
  13.           throw new RuntimeException(e);
  14.       }
  15.       return "Hello World";
  16.   });
  17.   CompletableFuture<String> a3 = CompletableFuture.supplyAsync(() -> {
  18.       try {
  19.           Thread.sleep(3000);
  20.       } catch (InterruptedException e) {
  21.           throw new RuntimeException(e);
  22.       }
  23.       return "Hello World";
  24.   });
  25.   // 这块最后是并行计算时间为3秒
  26.   CompletableFuture.allOf(a1, a2, a3).join();
  27.   String result = a1.get() + " | " + a2.get() + " | " + a3.get();
复制代码
使用方法(二)独立方法

如果方法比较独立,并且之前没有开发过,那么你可以通过异步方法来将这些逻辑与调用代码解耦
  1. @Service
  2. @EnableAsync
  3. public class ParallelTaskService {
  4.     @Async
  5.     public CompletableFuture<String> task1() {
  6.         // 模拟一个耗时操作
  7.         try {
  8.             Thread.sleep(3000);
  9.         } catch (InterruptedException e) {
  10.             e.printStackTrace();
  11.         }
  12.         return CompletableFuture.completedFuture("Task 1 completed");
  13.     }
  14.     @Async
  15.     public CompletableFuture<String> task2() {
  16.         // 模拟另一个耗时操作
  17.         try {
  18.             Thread.sleep(2000);
  19.         } catch (InterruptedException e) {
  20.             e.printStackTrace();
  21.         }
  22.         return CompletableFuture.completedFuture("Task 2 completed");
  23.     }
  24. }
  25. // 并行计算时,响应时间是2和3秒之中最大值,即3秒
  26. @GetMapping("/hello-world2")
  27. public CompletableFuture<String> helloWorld2() {
  28.     CompletableFuture<String> task1Result = parallelTaskService.task1();
  29.     CompletableFuture<String> task2Result = parallelTaskService.task2();
  30.     // 等待所有任务都完成
  31.     CompletableFuture<Void> allOf = CompletableFuture.allOf(task1Result, task2Result);
  32.     // 处理所有任务完成后的逻辑
  33.     return allOf.thenApply(voidResult -> {
  34.         String result = task1Result.join() + " | " + task2Result.join();
  35.         return result;
  36.     });
  37. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4