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());}
}

相关内容

热门资讯

山水皆有情!丽江两山一江的千年... 去过丽江、走过虎跳峡的人,大概率都听过哈巴雪山和金沙江的传说。很多人站在峡谷之下,望着奔腾不息的金沙...
活力中国调研行丨“殷”你而来 ... 9月12日,游客在殷墟博物馆“甲骨文展厅”内参观。位于河南省安阳市的殷墟博物馆新馆是首个全景式展现商...
浦江之夜赴美好相逢,第37届上... 9月12日晚,黄浦江畔灯火璀璨,第37届上海旅游节大巡游在外滩中山东一路上演。不少观众早早便来到外滩...
美丽中国丨秋韵紫鹊界 梯田入画... 这是9月11日拍摄的紫鹊界梯田(无人机照片)。 金秋九月,湖南省娄底市新化县紫鹊界梯田稻谷渐次成熟。...
中国之巅奏响《共同的节日》,千... 千吨阻尼器,“迎世赛、游上海旅游节”。9月13日,由上海市文化和旅游局指导推出上海旅游·会客│巅峰之...