1. 程式人生 > >ThreadPoolExecutor 執行緒池執行者

ThreadPoolExecutor 執行緒池執行者

整體的執行邏輯,不妨舉個例子。某個工廠要招工人完成訂單。有兩個重要的引數:1,長工的數目(假設為10),2,總工人的最大數目(假設為20)。

一開始,沒有工人,所以要招長工。現在開始,每有一個訂單,就去招一個工人當長工。直到長工數為10。接下來,老闆考慮訂單雖然多了,可是再招工人成本就太貴了,於是把新來的訂單放在流水線上暫存起來,叫目前的工人做完手上的活之後趕緊去流水線上繼續完成別的訂單。接下來訂單繼續增長,老闆發現現在的情況是長工已經完不成積壓的訂單。這怎麼辦呢?沒辦法還是要工人,要不然違約的代價更大。繼續開始招短工。這些短工一般是帶著任務進廠,也就是客戶一來訂單就立馬招個短工完成這個訂單從而保證任務不積壓。接下來客戶的訂單突然少了,以至於沒有訂單了。老闆發現很多工人無事可做,在他觀察一段時間後,開始裁員,當然是先裁短工了,因為一開始的打算就是招你們進去渡過這個火爆期的,現在任務完成了,你們就該走了。於是工廠的工人數又回到了長工數。一般情況下的老闆不會把長工一起裁掉,即使他們不幹活,也就讓他們睡覺。可是還是有很黑心的老闆直接把長工都裁掉了。

以上的故事中,工廠就是執行緒池,工人就是worker執行緒,訂單就是呼叫execute()傳進來的runnable引數,長工數就是corePoolSize,總工數是maximumPoolSize,流水線就是阻塞佇列,老闆觀察工人不幹活的時間是keepAliveTime,至於老闆裁不裁長工是由allowCoreThreadTimeOut引數控制的。

這就是整個執行緒池的執行邏輯。而工人的執行邏輯是:手上有任務就先完成手上的任務(工人的建構函式傳進來的runnable),如果沒有或者已經完成了就去阻塞佇列找任務做,當然如果沒有任務就阻塞自己。