線程池一大早就來到了公司,進到了屬於自己的“經理”辦公室,時間才剛剛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(干貨 | 建議珍藏)
【面試】如果你這樣回答“什么是線程安全”,面試官都會對你刮目相看(建議珍藏)
【面試】迄今為止把同步/異步/阻塞/非阻塞/BIO/NIO/AIO講的這么清楚的好文章(快快珍藏)
【面試】一篇文章幫你徹底搞清楚“I/O多路復用”和“異步I/O”的前世今生(深度好文,建議珍藏)
>>> 玩轉SpringBoot系列文章 <<<
【玩轉SpringBoot】用好條件相關注解,開啟自動配置之門
【玩轉SpringBoot】看似復雜的Environment其實很簡單
【玩轉SpringBoot】讓錯誤處理重新由web服務器接管
【玩轉SpringBoot】SpringBoot應用的啟動過程一覽表
【玩轉SpringBoot】通過事件機制參與SpringBoot應用的啟動過程
>>> 品Spring系列文章 <<<
品Spring:SpringBoot和Spring到底有沒有本質的不同?
品Spring:SpringBoot輕松取勝bean定義注冊的“第一階段”
品Spring:SpringBoot發起bean定義注冊的“二次攻堅戰”
品Spring:注解之王@Configuration和它的一眾“小弟們”
品Spring:對@PostConstruct和@PreDestroy注解的處理方法
品Spring:對@Autowired和@Value注解的處理方法
品Spring:真沒想到,三十步才能完成一個bean實例的創建
品Spring:關於@Scheduled定時任務的思考與探索,結果尷尬了