【JUC并发编程13】异步回调
文章目錄
- 13 異步回調
- 13.1 CompletableFuture
- 13.2 Future 與 CompletableFuture
13 異步回調
同步:指等待資源(阻塞)
異步:指設立哨兵,資源空閑通知線程,否則該線程去做其他事情(非阻塞)
13.1 CompletableFuture
CompletableFuture 在 Java 里面被用于異步編程,異步通常意味著非阻塞,可以使得我們的任務單獨運行在與主線程分離的其他線程中,并且通過回調可以在主線程中得到異步任務的執行狀態,是否完成,和是否異常等信息
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dtFH8lVz-1644299753647)(img/014.png)]
CompletableFuture 實現了 Future, CompletionStage 接口,實現了 Future接口就可以兼容現在有線程池框架,而 CompletionStage 接口才是異步編程的接口抽象,里面定義多種異步方法,通過這兩者集合,從而打造出了強大的CompletableFuture 類:
- 異步調用沒有返回值方法runAsync
- 異步調用有返回值方法supplyAsync
主線程調用 get 方法會阻塞
public class CompletableFutureTest {public static void main(String[] args) throws ExecutionException, InterruptedException {// 異步調用沒有返回值CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(()->{System.out.println(Thread.currentThread().getName()+" : CompletableFuture");});completableFuture.get();// 異步調用// mq消息隊列CompletableFuture<Integer> completableFuture1 = CompletableFuture.supplyAsync(()->{System.out.println(Thread.currentThread().getName()+" : CompletableFuture1");// 模擬異常int i = 10/0;return 1024;});// 完成之后調用completableFuture1.whenComplete((t,u)->{System.out.println("-----t:"+t); // 方法的返回值System.out.println("-----u:"+u); // 異常的返回信息}).get();} }具體whenComplete的源代碼為:
t為返回結果,u為異常信息
public CompletableFuture<T> whenComplete(BiConsumer<? super T, ? super Throwable> action) {return uniWhenCompleteStage(null, action); }13.2 Future 與 CompletableFuture
對比這兩種方法,一個為同步一個為異步
Futrue 在 Java 里面,通常用來表示一個異步任務的引用,比如我們將任務提交到線程池里面,然后我們會得到一個 Futrue,在 Future 里面有 isDone 方法來 判斷任務是否處理結束,還有 get 方法可以一直阻塞直到任務結束然后獲取結果,但整體來說這種方式,還是同步的,因為需要客戶端不斷阻塞等待或者不斷輪詢才能知道任務是否完成
的。
總結
以上是生活随笔為你收集整理的【JUC并发编程13】异步回调的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【JUC并发编程12】Fork与Join
- 下一篇: 【尚硅谷】大厂必备技术之JUC并发编程—