
1. 同步API
1.1. 阻塞式呼叫
1.2. 呼叫了某個方法,呼叫方在被呼叫方執行的程序中會等待,被呼叫方執行結束回傳,呼叫方取得被呼叫方的回傳值并繼續運行
2. 異步API
2.1. 非阻塞式呼叫
2.2. 會直接回傳,或者至少在被呼叫方計算完成之前,將它剩余的計算任務交由另一個執行緒去做
2.2.1. 該執行緒和呼叫方是異步的
2.3. 回傳的方式
2.3.1. 通過回呼函式
2.3.2. 由呼叫方再次執行一個“等待,直到計算完成”的方法呼叫
2.4. 執行比較耗時的操作時,尤其是那些依賴一個或多個遠程服務的操作,使用異步任務可以改善程式的性能,加快程式的回應速度
3. Future介面
3.1. 對將來某個時刻會發生的結果進行建模
3.1.1. 對異步計算進行建模,回傳一個指向執行結果的參考
3.1.2. 運算結束后,呼叫方可以通過該參考訪問執行的結果
3.2. 要使用Future,通常你只需要將耗時的操作封裝在一個Callable物件中,再將它提交給ExecutorService
3.2.1. 比更底層的Thread更好用
3.3. 多載版本的get方法
3.3.1. 接受一個超時的引數,定義執行緒等待Future結果的最長時間
3.3.2. 盡量在代碼中添加超時判斷的邏輯
3.3.3. 能防止程式永久地等待下去,超時發生時,程式會得到通知發生了TimeoutException
3.4. 局限性
3.4.1. 將兩個異步計算合并為一個
3.4.1.1. 兩個異步計算之間相互獨立
3.4.1.2. 第二個又依賴于第一個的結果
3.4.2. 等待Future集合中的所有任務都完成
3.4.3. 僅等待Future集合中最快結束的任務完成(有可能因為它們試圖通過不同的方式計算同一個值),并回傳它的結果
3.4.4. 應對Future的完成事件(即當Future的完成事件發生時會收到通知,并能使用Future計算的結果進行下一步的操作,不只是簡單地阻塞等待操作的結果)
4. CompletableFuture類
4.1. 實作了Future介面
4.2. 使用了Lambda運算式以及流水線的思想
4.3. 同步API的呼叫封裝到一個CompletableFuture中,你能夠以異步的方式使用其結果
4.4. 涉及等待I/O的操作(包括網路連接等待)
4.5. 依據等待/計算,或者W/C的比率設定需要使用的執行緒數
4.6. 處理流的流水線中如果發生I/O等待,流的延遲特性會讓我們很難判斷到底什么時候觸發了等待
4.7. 通過自定義CompletableFuture調度任務執行的執行器能夠更充分地利用CPU資源
4.7.1. 允許你對執行器(Executor)進行配置
4.7.1.1. 尤其是執行緒池的大小,讓它以更適合應用需求的方式進行配置,滿足程式的要求
4.7.2. 調整執行緒池的大小,能幫助你確保整體的計算不會因為執行緒都在等待I/O而發生阻塞
4.7.2.1. 并行流API無法提供的
4.7.3. 處理需大量使用異步操作的情況時,這幾乎是最有效的策略
4.8. supplyAsync方法
4.8.1. 接受一個生產者(Supplier)作為引數,回傳一個CompletableFuture物件,該物件完成異步執行后會讀取呼叫生產者方法的回傳值
4.8.2. 傳遞第二個引數指定不同的執行執行緒執行生產者方法
4.9. thenCompose
4.9.1. 允許你對兩個異步操作進行流水線,第一個操作完成時,將其結果作為引數傳遞給第二個操作
4.9.2. 不帶Async的方法和它的前一個任務一樣,在同一個執行緒中運行
4.9.3. 更高效一點,因為它少了很多執行緒切換的開銷
4.10. thenComposeAsync
4.10.1. 以Async結尾的方法會將后續任務提交到一個執行緒
4.11. thenCombine
4.11.1. 接受名為BiFunction的第二個引數,這個引數定義了當兩個CompletableFuture物件完成計算后,結果如何合并
4.12. thenCombineAsync
4.13. thenAccept
4.13.1. 接受CompletableFuture執行完畢后的回傳值做引數
4.13.2. 一旦CompletableFuture計算得到結果,它就回傳一個CompletableFuture?Void?
4.14. thenAcceptAsync
4.15. allOf
4.15.1. 接受一個由CompletableFuture構成的陣列,陣列中的所有CompletableFuture物件執行完成之后,它回傳一個CompletableFuture?Void?物件
4.16. anyOf
4.16.1. 接受一個CompletableFuture物件構成的陣列,回傳由第一個執行完畢的CompletableFuture物件的回傳值構成的CompletableFuture?Object?
4.17. orTimeout
4.17.1. Java 9
4.17.2. 在指定的超時到達時,會通過Scheduled-ThreadExecutor執行緒結束該CompletableFuture物件,并拋出一個TimeoutException例外,它的回傳值是一個新的CompletableFuture物件
4.18. completeOnTimeOut
4.18.1. Java 9
4.18.2. 如果服務偶然性地無法及時回應,臨時使用默認值繼續執行也是一種可接受的解決方案
4.18.3. 可以使用預定義的默認值繼續執行,不會發生失效
4.19. 對異步超時機制的支持
4.20. completeExceptionally方法
4.20.1. 將導致CompletableFuture內發生問題的例外拋出
4.20.2. 提供了例外管理的機制,讓你有機會拋出/管理異步任務執行中發生的例外
5. Stream介面
5.1. 計算密集型的操作,并且沒有I/O
5.2. 底層依賴的是執行緒數量固定的通用執行緒池
5.3. 實作簡單,同時效率也可能是最高的
5.3.1. 如果所有的執行緒都是計算密集型的,那就沒有必要創建比處理器核數更多的執行緒
6. 執行緒池大小與處理器的利用率之比
6.1. Nthreads=NCPU*UCPU*(1+W/C)
6.2. NCPU是處理器的核的數目
6.2.1. 通過Runtime.getRuntime().available Processors()得到
6.3. UCPU是期望的CPU利用率
6.3.1. 該值應該介于0和1之間
6.4. W/C是等待時間與計算時間的比率
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/544433.html
標籤:其他
