日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【JUC并发编程13】异步回调

發布時間:2025/3/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 方法可以一直阻塞直到任務結束然后獲取結果,但整體來說這種方式,還是同步的,因為需要客戶端不斷阻塞等待或者不斷輪詢才能知道任務是否完成

  • 不支持手動完成: 我提交了一個任務,但是執行太慢了,我通過其他路徑已經獲取到了任務結果,現在沒法把這個任務結果通知到正在執行的線程,所以必須主動取消或者一直等待它執行完成
  • 不支持進一步的非阻塞調用: 通過 Future 的 get 方法會一直阻塞到任務完成,但是想在獲取任務之后執行額外的任務,因為 Future 不支持回調函數,所以無法實現這個功能
  • 不支持鏈式調用: 對于 Future 的執行結果,我們想繼續傳到下一個 Future 處理使用,從而形成一個鏈式的 pipline 調用,這在 Future 中是沒法實現的。
  • 不支持多個 Future 合并: 比如我們有 10 個 Future 并行執行,我們想在所有的 Future 運行完畢之后,執行某些函數,是沒法通過 Future 實現的。
  • **不支持異常處理:**Future 的 API 沒有任何的異常處理的 api,所以在異步運行時,如果出了問題是不好定位的
    的。
  • **不支持異常處理:**Future 的 API 沒有任何的異常處理的 api,所以在異步運行時,如果出了問題是不好定位的
  • 總結

    以上是生活随笔為你收集整理的【JUC并发编程13】异步回调的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。