CompletableFuture是 java1.8 提供的一个新类,是对Future的增强,吸收了guava异步线程的特点,可以实现一系列的异步线程操作。CompletableFuture可以简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合 CompletableFuture 的方法。
CompletableFuture合适每个操作很复杂需要花费很长时间的的场景。
范例一:
/** * supplyAsync: 异步开始一个任务,并返回结果 * thenApply: 处理上一步的执行结果 * * allOf: 所有任务完成后才会返回 * anyOf: 任一任务完成就返回 */ private static void test2() throws Exception { List<String> list = new ArrayList<>(); ExecutorService executorService = Executors.newFixedThreadPool(10); List<Integer> taskList = Arrays.asList(2, 1, 3, 4, 5, 6, 7, 8, 9, 10); Long start = System.currentTimeMillis(); CompletableFuture[] arr = taskList.stream() .map(x -> CompletableFuture.supplyAsync(() -> x, executorService) //对每个元素异步做处理,并返回一个CompletableFuture对象 .thenApply(y -> Integer.toString(y)) //处理结果进一步处理 .whenComplete((r, e) -> { //异步处理完成后,获取结果 list.add(r); }) ) .toArray(CompletableFuture[]::new); //所有CompletableFuture对象转成一个数组 boolean all = false; if(all){ CompletableFuture.allOf(arr).join(); //等待所有任务完成后才会继续往下执行 }else{ Object result = CompletableFuture.anyOf(arr).get(); //只要有一个任务完成就继续往下执行 System.out.println("result=" + result); } System.out.println("list="+list+", 耗时="+(System.currentTimeMillis()-start)); executorService.shutdown(); }
范例二:
/**
* thenCompose:对两个任务进行串行执行,第一个完成后,将其结果作为参数传递给第二个
*/
public static void test3() throws Exception {
CompletableFuture<String> completableFuture1 = CompletableFuture.supplyAsync(() -> {
try {
System.out.println("task1 doing...");
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "result1";
});
CompletableFuture<String> completableFuture2 = completableFuture1.thenCompose(result -> CompletableFuture.supplyAsync(() -> {
try {
System.out.println("prvo result=" + result);
System.out.println("task2 doing...");
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "result2";
}));
System.out.println(completableFuture2.get());
}
范例三:
/** * thenCombine:组合两个执行结果。两个任务是并行执行的 * thenAccept:链末消费:接收上一阶段的输出作为本阶段的输入,执行任务 */ public static void test4() throws Exception { CompletableFuture<Integer> completableFuture1 = CompletableFuture.supplyAsync(() -> { try { System.out.println("task1 doing start"); Thread.sleep(1000); System.out.println("task1 doing end"); } catch (InterruptedException e) { e.printStackTrace(); } return 100; }); completableFuture1.thenAccept(result -> System.out.println("result1=" + result)); CompletableFuture<Integer> completableFuture2 = CompletableFuture.supplyAsync(() -> { try { System.out.println("task2 doing start"); Thread.sleep(3000); System.out.println("task2 doing end"); } catch (InterruptedException e) { e.printStackTrace(); } return 300; }); completableFuture2.thenAccept(result -> System.out.println("result2=" + result)); CompletableFuture<Integer> completableFuture3 = completableFuture2.thenCombine(completableFuture1, //合并函数 (result1, result2) -> result1 + result2 ); System.out.println(completableFuture3.get()); }
范例四:
/** * 递归做 thenCombine 处理 */ public static void test5() throws Exception { long s = System.currentTimeMillis(); CompletableFuture<Integer> completableFuture1 = CompletableFuture.supplyAsync(() -> { try { System.out.print("开始两两合并处理:0 + "); Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } return 0; }); for(int i=1; i<=7; i++){ completableFuture1 = completableFuture1.thenCombine( CompletableFuture.supplyAsync(() -> { int x = 0; try { Thread.sleep(3000); x = count.incrementAndGet(); System.out.print(x + " + "); } catch (InterruptedException e) { e.printStackTrace(); } return x; }) , (r1, r2) -> r1 + r2 ); } System.out.println("0 = " + completableFuture1.get()); System.out.println(System.currentTimeMillis() - s); }
范例五:
/** * runAsync: 异步执行,无返回 * supplyAsync: 异步执行,有返回 */ public static void test6(){ System.out.println("start doing..."); CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> { try { Thread.sleep(3000); int result = 100/0; } catch (Exception ex) { throw new RuntimeException(ex); } }); try { future1.get(); } catch (Exception ex) { System.out.println("future1 error: " + ex.toString()); } CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(3000); int result = 100/0; return result; } catch (Exception ex) { throw new RuntimeException(ex); } }); try { System.out.println(future2.get()); } catch (Exception ex) { System.out.println("future2 error: " + ex.toString()); } }
范例六:
/** * applyToEither: 应用两者中的任一,哪个先返回就用哪个 * runAfterBoth: 两个任务都完成后执行函数 * runAfterEither: 其中一个任务完成后执行函数,另一个任务忽略 */ public static void test7(){ String original = "Message"; CompletableFuture<String> f1 = CompletableFuture.completedFuture(original).thenApplyAsync(s -> { try { int sleep = ThreadLocalRandom.current().nextInt(5000); System.out.println("f1: " + sleep); TimeUnit.MILLISECONDS.sleep(sleep); System.out.println("f1 ok"); } catch (Exception e) { e.printStackTrace(); } return s.toUpperCase(); }); CompletableFuture<String> f2 = CompletableFuture.completedFuture(original).thenApplyAsync(s -> { try { int sleep = ThreadLocalRandom.current().nextInt(5000); System.out.println("f2: " + sleep); TimeUnit.MILLISECONDS.sleep(sleep); System.out.println("f2 ok"); } catch (Exception e) { e.printStackTrace(); } int i = 1/0; return s.toLowerCase(); }); // CompletableFuture<String> f3 = f1.applyToEither(f2, s -> s + " from applyToEither"); // System.out.println(f3.join()); // CompletableFuture<Void> f3 = f1.runAfterBoth(f2, () -> { // System.out.println("all ok"); // }); // f3.join(); // CompletableFuture<Void> f3 = f1.runAfterEither(f2, () -> { // System.out.println("one ok"); // }); // f3.join(); }
范例七:
/** * handle: 任务完成后或者抛出异常时,调用handle方法处理结果 * exceptionally: 捕获异常 */ public static void test8(){ CompletableFuture<String> f = CompletableFuture.completedFuture("Massges").thenApplyAsync(s -> { try { int sleep = ThreadLocalRandom.current().nextInt(3000); System.out.println("f: " + sleep); TimeUnit.MILLISECONDS.sleep(sleep); System.out.println("f ok"); } catch (Exception ex) { ex.printStackTrace(); } int i = 1/0; return s.toLowerCase(); }); CompletableFuture<String> f3 = f.handle((r, ex) -> { System.out.println(r + ", " + ex); int i = 1/0; return r; }).exceptionally(s -> { System.out.println("error: " + s); return null; }); System.out.println(f3.join()); }
相关推荐
以下是一个简单的CompletableFuture使用示例,展示如何异步执行任务并处理结果: ```java Supplier<String> task = () -> { Thread.sleep(2000); // 模拟耗时操作 return "Task Result"; }; CompletableFuture...
使用 `completedFuture` 静态工厂方法可以创建一个已经完成的 CompletableFuture,它接受一个值作为结果。例如: ```java CompletableFuture<String> cf = CompletableFuture.completedFuture("message"); ...
本文将深入探讨如何在Spring Boot 2中有效地使用`CompletableFuture`。 首先,`@Async`注解允许我们标记一个方法为异步执行,这意味着该方法将在单独的线程中运行,而非阻塞当前的执行流程。为了启用这个特性,我们...
CompletableFuture实现的工具类 ,使用泛型实现各类多线程操作,满足大部分要求
此外,`CompletableFuture`还支持链式调用,可以方便地与`CompletableFuture.allOf()`或`CompletableFuture.anyOf()`一起使用,以实现对多个异步任务的聚合或竞争。 总之,`CompletableFuture`是Java并发编程中的一...
异步:使用 CompletableFuture 线程池其他线程运行任务,异步方法的名字中带有 Async。 1.runAsync(不接收参数、不返回参数) runAsync() 是 CompletableFuture 最常用的方法之一,它可以接收一个待运行的任务并...
Java CompletableFuture 并行处理技术...在本文中,我们学习了如何使用 CompletableFuture 实现并行处理,提高系统的响应速度和效率。在实际工作中,我们可以根据需要选择合适的并行处理机制,提高系统的性能和效率。
02 CompletableFuture 的创建与使用 创建 CompletableFuture 可以通过直接实例化、工厂方法(如 supplyAsync)或者通过其他 CompletableFuture 组合。使用时,我们通常会利用 thenApply、thenAccept 和 thenCompose ...
CompletableFuture 的使用方法有多种,例如使用 runAsync 方法和 supplyAsync 方法来创建 CompletableFuture 对象。runAsync 方法用于执行Runnable 任务,而 supplyAsync 方法用于执行 Supplier 任务。 在烧水泡茶...
下面的示例展示了如何使用`CompletableFuture`来构建这种依赖关系。 ```java CompletableFuture<Integer> taskA = CompletableFuture.supplyAsync(() -> { delayRandom(1000, 3000); return 1; }, executor); ...
在这个"Java8集合 CompletableFuture lambda表达式 新的TimeAPI 和ForkJoin Demo包"中,我们可以深入探讨以下几个关键知识点: 1. **Lambda表达式**: Lambda表达式是Java 8的一大亮点,它简化了对匿名函数的处理...
`CompletableFutureExamples-master`这个压缩包可能包含了各种`CompletableFuture`的使用示例,涵盖了上述功能的实践应用。通过学习这些示例,你可以深入理解如何在实际项目中利用`CompletableFuture`进行高效的异步...
强化学习.您将收获: - 为什么会选择 CompletableFuture - 如何创建CompletableFuture异步任务 - CompletableFuture异步任务回调使用 - CompletableFuture异步任务编排 - CompletableFuture的异常处理
在实际项目中,我们还可以使用`CompletableFuture.allOf()`或`anyOf()`来并发执行多个异步操作,并等待它们全部或任意一个完成。这有助于提高测试效率,特别是在测试依赖多个服务或组件的复杂系统时。 总之,`Java8...
###如何在我的项目中使用该库? 并使用maven生成.jar文件: 注意:您将需要下载并创建快照。 git clone https://github.com/JeffreyFalgout/completable-futurescd completable-futures/mvn package从页面下载一个....
详细的demo
假设你使用 Future 运行子线程调用远程 API 来获取某款产品的最新价格,服务器由于洪灾宕机了,此时如果你想手动结束计算,而是想返回上次缓存中的价格,这是 Future 做不到的 调用 get() 方法会阻塞程序 Future ...
`PlayJava8Future`项目是一个实用程序库,旨在帮助开发者在`Play Framework`的应用程序中无缝使用`Java 8`的`CompletableFuture`。这个库主要解决的问题是在`Play Framework`的Action上下文中,如何与`...
android-retrofuture android-retrofuture是Java 8 CompletableFuture API的后向版本,已升级为希望使用Android Studio 3.x D8 / desugar工具链的Android开发人员的当前Java 9(JEP 266)增强功能。 此代码中没有...