線程池一大早就來到了公司,進到了屬於自己的“經理”辦公室,時間才剛剛8點,雖然他不用打卡。不覺中時間來到了8:40,公司的“中層管理”人員們陸續到來,打卡後坐到各自工位,稍作調整,準備參加公司的“晨會”。趁還有點時間,就給大家介紹下出席晨會的人員吧。線程池就是Java里的大名鼎鼎的ThreadPoo ...
線程池一大早就來到了公司,進到了屬於自己的“經理”辦公室,時間才剛剛8點,雖然他不用打卡。
不覺中時間來到了8:40,公司的“中層管理”人員們陸續到來,打卡後坐到各自工位,稍作調整,準備參加公司的“晨會”。
趁還有點時間,就給大家介紹下出席晨會的人員吧。線程池就是Java里的大名鼎鼎的ThreadPoolExecutor,是經理。
六個中層管理人員分別是:int corePoolSize、int maximumPoolSize、long keepAliveTime、BlockingQueue<Runnable> workQueue、ThreadFactory threadFactory、RejectedExecutionHandlerhandler。
他們都是線程池的好基友,畢竟大家合在一起才能使公司良好運行。
8:50已到,晨會準時開始,線程池說,公司又有了新的項目,需要一批開發人員,今天約了很多面試者,我也會參與和大家一起做好面試工作。
我們會安排4位核心面試官負責面試,如果實在忙不過來的話,可以陸續的再加入6位,也就是說今天最多會投入10位面試官。
晨會上每個中層管理分工明確,都領到了自己的工作,線程池則負責整體的協調工作。
晨會結束後,大家都進入了狀態,隨時準備迎接面試者的到來。說時遲那時快,這不,人來了。
int corePoolSize
線程池問corePoolSize,現在有幾個面試官在面試?corePoolSize回答到,0個。
線程池接著對threadFactory說,去請1位面試官過來,threadFactory立馬請來了1位,開始給這個面試者面試。
corePoolSize趕緊在紙上記下,現有核心面試官1人,最多能有4人,面試進行中的1人。
這時又來了2位面試者,線程池又問corePoolSize同樣的問題,corePoolSize如實回答。
線程池又讓threadFactory請來2位面試官,正好一人面試一個。
corePoolSize也隨即記錄下,現有核心面試官3人,最多能有4人,面試進行中的3人。
不一會第一個面試官結束了面試,送走了面試者。corePoolSize對面試官說,你別回去了,在這等會吧,反正待會還有人來。
corePoolSize也更新了自己的記錄,現有核心面試官3人,最多能有4人,面試進行中的2人,空閑面試官1人。
不料此時又來了1位面試者,線程池看了看corePoolSize的記錄,發現核心面試官雖然有1人空閑,但是還有1個名額可用。
心裡想著就讓空閑的面試官休息一下吧,於是又讓threadFactory請來1位面試官進行面試。
corePoolSize隨即又更新了自己的記錄,現有核心面試官4人,最多能有4人,面試進行中的3人,空閑面試官1人。
過了一會又有一個面試官結束了面試。corePoolSize同樣讓他原地休息,不用回去了。等待接下來的人吧。
corePoolSize再次更新了自己的記錄,現有核心面試官4人,最多能有4人,面試進行中的2人,空閑面試官2人。
BlockingQueue<Runnable> workQueue
空閑面試官還未休息片刻,此時又來了好幾個面試者,線程池照例看了看corePoolSize的記錄。心裡琢磨起來。
4位核心面試官都已就位,名額用完了。現在只有2個空閑的,所以就只能安排2個人面試了。把剩下的面試者交給workQueue吧。
corePoolSize趕緊更新記錄,現有核心面試官4人,最多能有4人,面試進行中的4人,空閑面試官0人。
然後只見workQueue在會議室外面擺上一排椅子,總共10個,請暫時沒有面試的面試者依次坐在椅子上等候。
只要一有面試者結束面試,workQueue就讓等候的第一個人進去。後面的每個人都往前坐一位。
workQueue把這個規則給坐著等候面試的人強調了幾遍後,就自己找到地方偷懶去了,估計是看手機啥的。
此時又來了幾個面試者,線程池還是先看corePoolSize的記錄,看完後搖了搖頭,直接把他們發給了workQueue。
workQueue還沒有看幾眼手機呢,就又被線程池給叫了去。最終workQueue領著剛來的面試者,讓他們坐到椅子上跟著一起排隊等候。
新的面試者陸續不斷的到來,雖然4個核心面試官都在馬不停蹄的忙著,可是明顯速度不夠快啊。
workQueue擔心照這樣下去,到時我這裡連坐著排隊的椅子都沒有了。哎,真是怕什麼來什麼,這不,又來人了。
int maximumPoolSize
新來的幾個面試者又被線程池發給了workQueue,待他們坐下來排隊後,發現還有1位面試者沒有椅子可坐了。workQueue趕緊把這個情況報告給線程池。
線程池找來maximumPoolSize說到,4位核心面試官都在忙碌,排隊等候的地兒也滿了,現在輪到你了。
maximumPoolSize說,我這裡一共可以出6位擴展面試官,現在一位還沒出過呢,所以沒有問題。
於是線程池讓threadFactory去請來1位面試官,來面試這個沒有椅子坐的面試者。
maximumPoolSize也趕緊記錄下信息,現有擴展面試官1人,最多能有6人,面試進行中1人。
在5位面試官的努力下,椅子終於出現了空閑,後續又來的幾位面試者,依然坐在椅子上排隊等候。
不一會椅子又坐滿了,還多出來2個面試者沒地兒坐,workQueue趕緊又報告給了線程池。
線程池看了maximumPoolSize的記錄,又讓threadFactory去請來2位面試官,面試這2位沒地兒坐的人。
maximumPoolSize隨即也更新了記錄,現有擴展面試官3人,最多能有6人,面試進行中3人。
long keepAliveTime
隨著面試的進行,排隊等待面試的人越來越少。又過了一會,終於沒有排隊的了,都進入了面試中。
有一個擴展面試官結束面試了。maximumPoolSize上前說到,你先原地休息一下吧。然後找來了keepAliveTime。
讓keepAliveTime記錄下這個擴展面試官開始休息的時間,並說如果5分鐘後還沒有新的面試者到來,就先讓他回去,需要時再去叫他。
keepAliveTime隨即開始了計時。maximumPoolSize也更新了記錄,現有擴展面試官3人,最多能有6人,面試進行中2人,空閑著的1人。
可能臨近中午了,確實沒有新的面試者到了,5分鐘後,keepAliveTime讓這個休息的擴展面試官回去自己的工位了。並告知了maximumPoolSize。
maximumPoolSize也立即再次更新記錄,現有擴展面試官2人,最多能有6人,面試進行中2人,空閑著的0人。
另兩位擴展面試官在面試結束後,都通過相同的流程並最終回到各自的工位了。
maximumPoolSize最後更新的記錄,現有擴展面試官0人,最多能有6人。
不過4位核心面試官就沒有這麼幸運了,他們只能原地休息等待,不能回去。
corePoolSize最後更新了自己的記錄,現有核心面試官4人,最多能有4人,面試進行中的0人,空閑面試官4人。
不知不覺中午已到來,面試者都已回去,經理和中層管理都去吃飯、休息了。
RejectedExecutionHandler handler
下午2:00上班,一下子來了一屋子的面試者,線程池馬上發話,我們要開足馬力,盡最大限度招待面試者。
corePoolSize負責的4個核心面試官全部都在面試中。workQueue負責的10個椅子也坐滿了面試者在排隊等候。
maximumPoolSize負責的6個擴展面試官也全部就位並都在面試中。整個公司再沒有一塊地兒可安排多餘的面試者了。
於是線程池找來了handler,讓他去接待多餘的面試者,其實就是適當的記錄每個面試者的信息,然後直接打發他們走。
有的面試者直接就走掉了,有的面試者留下了信息說以後再聯繫,不管如何吧,反正多餘的面試者都被handler攆走了。
handler也挺無奈的,心裡想著你們幹嘛都一起來呀,分散著來不行啊,我實在不想拒絕你們,可沒辦法,哎。
線程池心裡也委屈,我只是一個經理,又不是老闆,老闆就給我了這麼點資源啊,我太難了,轉過身留下了兩滴眼淚。
(END)
作者是工作超過10年的碼農,現在任架構師。喜歡研究技術,崇尚簡單快樂。追求以通俗易懂的語言解說技術,希望所有的讀者都能看懂並記住。
>>> 熱門文章集錦 <<<
爸爸又給Spring MVC生了個弟弟叫Spring WebFlux
【面試】吃透了這些Redis知識點,面試官一定覺得你很NB(乾貨 | 建議珍藏)