了解CompletableFuture
生活随笔
收集整理的這篇文章主要介紹了
了解CompletableFuture
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
了解CompletableFuture
為什么要引入CompletableFuture
為了獲得最佳性能表現,可能就需要仔細規劃業務流程中的各個步驟的編排。而Java8就提供了這樣一個即用容器來連接一系列任務。
CompletableFuture 如何來構建一個任務鏈呢?這里就不先介紹API了,之前看應用場景。
目前有一個需求:
? 我們需要從 數據中臺中獲取 安徽、江蘇、浙江三省內所有企業信息 及其 子公司 的信息,并按 **子公司數量 **進行排序。
我從觀察到的代碼(finchinaApp)中來看,如果遇到這種類似的需求,基本會采用多線程池 并發的查詢安徽、江蘇、浙江三省的公司,然后線程池內線程都結束執行,再對所有的結果進行排序。
當然在這種場景下,使用FutureTask 或者 線程池 +
CountDownLatch countDownLatch = new CountDownLatch(3); new Thread(() - >{//查詢安徽countDownLatch.countDown(); }).start(); new Thread(() - >{//查詢江蘇countDownLatch.countDown(); }).start(); new Thread(() - >{//查詢浙江countDownLatch.countDown(); }).start(); try {countDownLatch.await(); } catch (InterruptedException e) {//日志記錄 } MultiTaskScheduler multiTaskScheduler = new MultiTaskScheduler(); multiTaskScheduler.add(()->{//查詢安徽 }) multiTaskScheduler.add(()->{//查詢江蘇 }) multiTaskScheduler.add(()->{//查詢浙江 }) try {multiTaskScheduler.start(true, 10000); } catch (InterruptedException e) {// + 日志Thread.currentThread().interrupt(); } finally {multiTaskScheduler.shutdown(); }可以觀察到,該使用場景下,不需要引入CompletableFuture。如果是以下場景呢?
簡單說明:
1. 如果業務中每個線程需要線程結束后立即進行處理,而非等待其他線程都結束再進行操作,則需要使用CompletableFuture。 2. 如果 業務1 和 業務2 并行執行,任意一個任務失敗/成功,則標志整個業務失敗/成功,則需要使用CompletableFuture 3. 如果 每個線程中有較為復雜的異步任務編排(組合多個Future并行執行結果),則建議使用CompletableFuture,因為可以簡化代碼,同時極其優雅。CompletableFuture的優點就在于 :
? ①有回調函數,可以在執行完成后自動調用回調處理邏輯;
? ②其提供的四十多個API可以優雅的編排任務鏈(提供異步任務完成后的鏈式調用);
? ③具備異常處理機制
CompletableFuture的使用
使用誤區1:CompletableFuture所有的方法都有額外以Async結尾的方法。此類方法的作用在于不是說 后續任務可以在前序任務還沒執行完就可以運行。舉例:
總結
以上是生活随笔為你收集整理的了解CompletableFuture的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 免费在excel密码破解--超好用
- 下一篇: Windows10启动缓慢的原因以及解决