CompletableFuture非同步執行緒
- 2020 年 8 月 13 日
- 筆記
1、執行緒池七大參數介紹
(1)corePoolSize:執行緒池中常駐核心執行緒數
(2)maximumPoolSize:執行緒池能夠容納同時執行的最大執行緒數,此值必須大於等於1
(3)keepAliveTime:多餘的空閑執行緒存活時間。當前執行緒池數量超過corePoolSize時,當空閑時間到達keepAliveTime值時,多餘空閑執行緒會被銷毀直到只剩下corePoolSize個執行緒為止。
(4)unit:keepAliveTime的時間單位
(5)BlockingQueue:阻塞隊列,如果任務很多,就將在目前多的任務放在隊列里。只要有空閑,就回去隊列里去除最新的任務執行。
(6)threadFactory:表示生成執行緒池中的工作執行緒的執行緒工廠,用於創建執行緒,一般為默認執行緒工廠即可
(7)handler:拒絕策略,表示當隊列滿了並且工作執行緒大於等於執行緒池的最大執行緒數(maximumPoolSize)時如何來拒絕來請求的Runnable的策略
2、運行順序
1、執行緒池創建,準備好core數量的核心執行緒,準備接受任務。
2、新的任務進來,用core準備好的空閑執行緒執行。
(1)、core滿了,就將再進來的任務放入阻塞隊列中。空閑的core就會自己去阻塞隊
列獲取任務執行
(2)、阻塞隊列滿了,就直接開新執行緒執行,最大只能開到ma指定的數量
(3)、max都執行好了。max-core數量空閑的執行緒會在 keepAliveTime指定的時間後自
動銷毀。最終保持到core大小
(4)、如果執行緒數開到了max的數量,還有新任務進來,就會使用 reject指定的拒絕策
略進行處理
3、所有的執行緒創建都是由指定的 factory創建的。
3、非同步對象
CompletableFuture提供了四個靜態方法來創建一個非同步操作。
1、static CompletableFuture<void> runAsync(Runnable runnable)
2、public static CompletableFuture <void> runAsync(Runnable runnable, Executor executor)
3、public static <U> CompletableFuture<U> SupplyAsync(Supplier <U> supplier)
4、 public static <U> CompletableFuture<U> supplyAsync(Supplier <U> supplier, Executor executor)
runXxoox都是沒有返回結果的, supplyXox都是可以獲取返回結果的
4、計算完成時回調方法
public CompletableFuture<T> whenCompleteBiConsumer<? super T,? super Throwable> action);
public CompletableFuture<T> whenCompleteAsyn(BiConsumer<? super T,? super Throwable>action):
public CompletableFuture<T> whenCompleteAsyncBiconsumer<? super T,? super Throwable>action, Executor executor);
public CompletableFuture<T> exceptionallyFunction<Throwable, extends T> fn);
whenComplete可以處理正常和異常的計算結果但是無法修改返回數據, exceptionally處理異常情況並且可以修改返回數據。
whenComplete和 whenCompleteAsync的區別:
- whenComplete:是執行當前任務的執行緒執行繼續執行 whenComplete的任務。
- whenCompleteAsync:是執行把 whenCompleteAsync這個任務繼續提交給執行緒池來進行執行。
方法不以 Async結尾,意味著 Action使用相同的執行緒執行,而 Async可能會使用其他執行緒執行(如果是使用相同的執行緒池,也可能會被同一個執行緒選中執行)
5、 handle方法
public Completionstage< handleBiFunction<? super T, Throwable, extends U> fn):
public <U> CompletionstagecU> handleAsyneBiFunction<? super T, Throwable, extends U> fn);
public <U> CompletionstagecU> handleAsyncBiFunction<? super T, Throwable, extends U> fn, Executor executor);
- 和 complete一樣,可對結果做最後的處理(可處理異常),可改變返回值。
6、兩任務組合-都要完成
public <U,V> CompletableFuturec <V> thenCombine( Completionstage< ? extends U> other, BiFunction<? super T,? super U,? extends> fn);
public<U,V> CompletableFuture <V> thenCombineAsync( CompletionStage<? extends> other, BiFunction<? super T.? super U,? extends> fn);
public <U,V> CompletableFuture<V> thenCombineAsync(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends> fn, Executor executor);
public <U> CompletableFuture<Void> thenAcceptBoth(Completionstage<? extends U> other,Biconsumer< super T, super> action);
public <U> CompletableFuturevoid <Void> thenAcceptBothasync(Completionstage<? extends U> other, Biconsumer<? super T, super U> action);
public <U> CompletableFuture<Void> thenAcceptBothasync(Completionstage<? extends U> other,Biconsumer<? super T, super Uaction, Executor executor);
public CompletableFuture<Void> runAfterBotl(Completionstage<?> other,Runnable action);
public CompletableFuture<Void> runAfterBothAsync(CompletionStage<?> other, Runnable action);
public CompletableFuture<Void> runAfterBothAsync(Completionstage<?> other,Runnable action, Executor executor);
- 兩個任務必須都完成,觸發該任務。
- thenCombine:組合兩個 future,獲取兩個 future的返回結果,並返回當前任務的返回值;
- thenAcceptBoth:組合兩個 future,獲取兩個 future任務的返回結果,然後處理任務,沒有返回值;
- runAfterBoth:組合兩個 future,不需要獲取 future的結果,只需兩個future處理完任務後,處理該任務。
7、多任務組合
public static CompletableFuture<> allof(CompletableFuture<?>… cfs);
public static CompletableFuture> anyof(CompletableFuture<>…cfs);
- allof:等待所有任務完成
- anyOf:只要有一個任務完成