任意組合、編排的多線程併發框架,支持任意阻塞、等待、串並行組合,回調、超時、默認值等

併發場景可能存在的需求之——任意編排

1 多個執行單元的串行請求

 

2 多個執行單元的並行請求

 

3 阻塞等待,串行的後面跟多個並行

 

4 阻塞等待,多個並行的執行完畢後才執行某個

 

5 串並行相互依賴

 

6 複雜場景

併發場景可能存在的需求之——每個執行結果的回調

傳統的Future、CompleteableFuture一定程度上可以完成任務編排,並可以把結果傳遞到下一個任務。如CompletableFuture有then方法,但是卻無法做到對每一個執行單元的回調。譬如A執行完畢成功了,後面是B,我希望A在執行完後就有個回調結果,方便我監控當前的執行狀況,或者打個日誌什麼的。失敗了,我也可以記錄個異常信息什麼的。

此時,傳統的就無能爲力了。

我的框架提供了這樣的回調功能。並且,如果執行失敗、超時,可以在定義這個執行單元時就設定默認值。

併發場景可能存在的需求之——執行順序的強依賴和弱依賴

如上圖的3,A和B併發執行,最後是C。

有些場景下,我們希望A和B都執行完畢後,才能執行C,CompletableFuture裏有個allOf(futures...).then()方法可以做到。

有些場景下,我們希望A或者B任何一個執行完畢,就執行C,CompletableFuture裏有個anyOf(futures...).then()方法可以做到。

我的框架同樣提供了類似的功能,通過設定wrapper裏的addDepend依賴時,可以指定依賴的任務是否must執行完畢。如果依賴的是must要執行的,那麼就一定會等待所有的must依賴項全執行完畢,才執行自己。

如果依賴的都不是must,那麼就可以任意一個依賴項執行完畢,就可以執行自己了。

併發場景可能存在的需求之——依賴上游的執行結果作爲入參

譬如A-B-C三個執行單元,A的入參是String,出參是int,B呢它需要用A的結果作爲自己的入參。也就是說A、B並不是獨立的,而是有結果依賴關係的。

在A執行完畢之前,B是取不到結果的,只是知道A的結果類型。

那麼,我的框架也支持這樣的場景。可以在編排時,就取A的結果包裝類,作爲B的入參。雖然此時尚未執行,必然是空,但可以保證A執行完畢後,B的入參會被賦值。

併發場景可能存在的需求之——全組任務的超時

一組任務,雖然內部的各個執行單元的時間不可控,但是我可以控制全組的執行時間不超過某個值。通過設置timeOut,來控制全組的執行閾值。

併發場景可能存在的需求之——高性能、低線程數

該框架全程無鎖,沒有一個加鎖的地方。

創建線程量少。

如這樣的,A會運行在B、C執行更慢的那個單元的線程上,而不會額外創建線程。

總結

該併發框架提供

> 1 提供任何形式的串行、並行執行單元的組合。如a、b、c的串行,a、b的串行同時與c並行,a、b、c的並行
> 2 爲每個執行單元提供執行成功、失敗、超時、異常的回調
> 3 支持爲單個執行單元設置異常、失敗後的默認值
> 4 支持爲整個group(多個任意組合的執行單元)設置超時時間。單個執行單元失敗,不影響其他單元的回調和最終結果獲取。如果自己依賴的任務失敗,則自己也立刻失敗。
> 5 整個group執行完畢或超時後,同步阻塞返回所有執行單元結果集,按添加的順序返回list。也支持整個group的異步回調不阻塞主線程
> 6 支持每個group獨享線程池,或所有group共享線程池(默認)

該併發框架已開源,https://gitee.com/tianyalei/asyncTool

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章