CompletableFuture
admin
2024-01-30 06:06:19

之前的多线程处理

Runnable --> Void

Callable --> Future      (get() 阻塞等待结果,或者while一直等待结果)

现在的异步编程

等结果完成后,自动触发回调方法。

CompletableFunction

a) 提供要运行的任务

  • runAsync        无返回结果
  • supplyAsync   有返回结果

b)任务完成后触发

  • thenRun        完成任务时没有结果,然后接着运行下一个任务
  • thenAccept    完成任务时有结果,处理该结果不用返回数据。
  • thenApply      完成任务时有结果,处理改结果并返回新的数据。


​​​​​​​c) 处理执行流程中碰到的异常

  • exceptionally  当异常情况发生时,处理异常信息。
  • handle            数据和异常同时由handle函数处理。

Testing Code:

package com.coupang.flink;import org.junit.Test;import java.time.LocalDateTime;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;/*** description: TODO** @author adore.chen* @date 2022-11-18*/
public class CompletableFutureTest {@Testpublic void runAsync() {CompletableFuture completableFuture = CompletableFuture.runAsync(() -> {System.out.println("First Runnable Task ... at " + LocalDateTime.now());try {TimeUnit.MILLISECONDS.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}).thenRun(() -> System.out.println("Second Runnable Task ... at " + LocalDateTime.now()));completableFuture.join();System.out.println("Main thread finished! ");}@Testpublic void runAsyncException() {CompletableFuture completableFuture = CompletableFuture.runAsync(() -> {System.out.println("First Runnable Task ... at " + LocalDateTime.now());throw new IllegalArgumentException("Unknown exception ...");}).thenRun(() -> System.out.println("Second Runnable Task ... at " + LocalDateTime.now())).exceptionally(e -> {System.out.println("meet some exception");e.printStackTrace(System.err);return null;});completableFuture.join();System.out.println("Main thread finished! ");}@Testpublic void supplyAsync() {CompletableFuture completableFuture = CompletableFuture.supplyAsync( () -> {System.out.println("First Callable Task ... at " + LocalDateTime.now());try {TimeUnit.MILLISECONDS.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}return "First Result";}).thenAccept(r -> {System.out.println("Second Callabe Task ... at " + LocalDateTime.now());System.out.println("Received result from First Callable: " + r);});completableFuture.join();System.out.println("Main Thread Finished");}@Testpublic void supplyAsyncResult() throws ExecutionException, InterruptedException {CompletableFuture completableFuture = CompletableFuture.supplyAsync( () -> {System.out.println("First Callable Task ... at " + LocalDateTime.now());try {TimeUnit.MILLISECONDS.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}return "First Result";}).thenApply(r -> {System.out.println("Second Callabe Task ... at " + LocalDateTime.now());System.out.println("Received result from First Callable: " + r);return "Second Task Result";});System.out.println("Main Thread Finished with Result: " + completableFuture.get());}public static void supplyAsyncHandle() throws ExecutionException, InterruptedException {CompletableFuture completableFuture = CompletableFuture.supplyAsync( () -> {System.out.println("First Callable Task ... at " + LocalDateTime.now());try {TimeUnit.MILLISECONDS.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}return "First Result";}).thenApply(r -> {System.out.println("Second Callabe Task ... at " + LocalDateTime.now());System.out.println("Received result from First Callable: " + r);return "Second Task Result";}).handle((data, e) -> {System.out.println("get result from first task, result: " + data);if (e != null) {e.printStackTrace();}return "handle over";});System.out.println("Main Thread Finished with Result: " + completableFuture.get());}@Testpublic void supplyAsyncHandleException() throws ExecutionException, InterruptedException {CompletableFuture completableFuture = CompletableFuture.supplyAsync( () -> {System.out.println("First Callable Task ... at " + LocalDateTime.now());throw new IllegalArgumentException("Unkown Exception !!!");}).thenApply(r -> {System.out.println("Second Callabe Task ... at " + LocalDateTime.now());System.out.println("Received result from First Callable: " + r);return "Second Task Result";}).handle((data, e) -> {System.out.println("get result from first task, result: " + data);if (e != null) {e.printStackTrace();}return "handle over";});System.out.println("Main Thread Finished with Result: " + completableFuture.get());}
}

相关内容

热门资讯

穿越天山遇见四季童话:新疆深度... 穿越天山遇见四季童话:新疆深度旅行指南与秘境故事 序章:一封来自西域的情书 每年六月,当伊犁河谷的薰...
从戈壁到花海:一位新疆本地向导... 从戈壁到花海:一位新疆本地向导的四季旅行手记 在新疆生活了近二十年,我依然记得第一次被这片土地震撼的...
穿越军 - 穿越中国亲子挑战赛... 以前总带孩子去各地旅游,打卡景点、吃美食,回来之后孩子除了照片,什么都没留下,直到带他参加穿越军亲子...
2026最新山东旅行社综合实力... 随着 2026 年旅游市场持续升温,山东凭借 "一山一水一圣人" 的独特魅力和丰富的文旅资源,成为国...
二十年,再赴大熊山 人间忽晚,山河已秋。一别大熊山,已是整整二十载。 那时我匆匆登临,步履轻快,眼里只有山川壮阔、林木葱...