SmartExecutor
他是一個(gè)執(zhí)行器
通過(guò)這個(gè)執(zhí)行器核无,你可以很輕松的控制一堆任務(wù)的執(zhí)行,
- 設(shè)置并發(fā)的數(shù)量
- 設(shè)置排隊(duì)的數(shù)量
- 設(shè)置調(diào)度策略
- 設(shè)置過(guò)載策略绍坝。
基礎(chǔ)知識(shí)
想要明白 SmartExecutor 是如何運(yùn)轉(zhuǎn)的,我們首先要明白幾個(gè)概念。
1. Executor 是什么粟誓?
簡(jiǎn)單的說(shuō):
執(zhí)行器就是一個(gè) 可以執(zhí)行 Runnable 任務(wù)的對(duì)象。
Executor這個(gè)接口提供了一種解耦的方式:每個(gè)任務(wù)的具體定義起意,和每個(gè)任務(wù)的執(zhí)行相分離鹰服。(執(zhí)行:線程的使用,調(diào)度等等)揽咕。
具體見(jiàn)我的這篇文章 Excutor(very good)
2. ExecutorService是什么悲酷?
litego 中很多思想應(yīng)該是來(lái)自這里。
具體見(jiàn)我的這篇文章 ExecutorService(very good)
一堆任務(wù)的控制
你可以把一堆任務(wù)拋給 SmartExecutor亲善,怎么拋給它设易?
如下圖,好多種姿勢(shì):
最終會(huì)都會(huì)執(zhí)行這個(gè)方法:
這堆任務(wù)怎么管理蛹头?
把他們放到集合里面顿肺,你想怎么管理,就怎么管理掘而!
(
你把兔子放到籠子里面挟冠,想讓哪只出來(lái)跑,就讓哪知出來(lái)跑袍睡。
想把兔子放到哪知籠子知染,就放到哪知籠子。 嘿嘿
)
litego是這樣處理的:
過(guò)載策略:
- DiscardNewTaskInQueue:把等待隊(duì)列中的 最后一個(gè)任務(wù)拋棄掉斑胜。
- DiscardOldTaskInQueue: 把等待隊(duì)列中的 第一個(gè)任務(wù)拋棄掉控淡。
- CallerRuns:直接在當(dāng)前線程中運(yùn)行嫌吠。
- DiscardCurrentTask:直接拋棄。
- ThrowExecption:拋出異常掺炭。
現(xiàn)在問(wèn)題來(lái)了:
一個(gè)任務(wù)執(zhí)行完畢了辫诅,如何去執(zhí)行等待隊(duì)列中的下一個(gè)任務(wù)?
答案就是涧狮,一個(gè)任務(wù)執(zhí)行完畢炕矮,就去等待隊(duì)列中的下一個(gè)任務(wù)。
只需要wrap當(dāng)前的runnable就可以了:
這個(gè)思想跟 Executor 官方提供的例子很像者冤。
當(dāng)去執(zhí)行等待隊(duì)列中的任務(wù)的時(shí)候肤视,就可以控制調(diào)度策略了:
針對(duì)過(guò)載策略,litego這樣的處理跟 ThreadPoolExecutor 中RejectedExecutionHandler的處理一個(gè)思想: