線程池開門營業招聘開發人員的一天



線程池一大早就來到了公司,進到了屬於自己的“經理”辦公室,時間才剛剛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年的碼農,現在任架構師。喜歡研究技術,崇尚簡單快樂。追求以通俗易懂的語言解說技術,希望所有的讀者都能看懂並記住。

    

>>> 熱門文章集錦 <<<

 

畢業10年,我有話說

【面試】我是如何面試別人List相關知識的,深度有點長文

我是如何在畢業不久只用1年就升為開發組長的

爸爸又給Spring MVC生了個弟弟叫Spring WebFlux

【面試】我是如何在面試別人Spring事務時“套路”對方的

【面試】Spring事務面試考點吐血整理(建議珍藏)

【面試】我是如何在面試別人Redis相關知識時“軟懟”他的

【面試】吃透了這些Redis知識點,面試官一定覺得你很NB(干貨 | 建議珍藏)

【面試】如果你這樣回答“什么是線程安全”,面試官都會對你刮目相看(建議珍藏)

【面試】迄今為止把同步/異步/阻塞/非阻塞/BIO/NIO/AIO講的這么清楚的好文章(快快珍藏)

【面試】一篇文章幫你徹底搞清楚“I/O多路復用”和“異步I/O”的前世今生(深度好文,建議珍藏)

【面試】如果把線程當作一個人來對待,所有問題都瞬間明白了

Java多線程通關———基礎知識挑戰

品Spring:帝國的基石

 

>>> 玩轉SpringBoot系列文章 <<<

 

【玩轉SpringBoot】配置文件yml的正確打開姿勢

【玩轉SpringBoot】用好條件相關注解,開啟自動配置之門

【玩轉SpringBoot】給自動配置來個整體大揭秘

【玩轉SpringBoot】看似復雜的Environment其實很簡單

【玩轉SpringBoot】翻身做主人,一統web服務器

【玩轉SpringBoot】讓錯誤處理重新由web服務器接管

【玩轉SpringBoot】SpringBoot應用的啟動過程一覽表

【玩轉SpringBoot】通過事件機制參與SpringBoot應用的啟動過程

【玩轉SpringBoot】異步任務執行與其線程池配置

 

>>> 品Spring系列文章 <<<

 

品Spring:帝國的基石

品Spring:bean定義上梁山

品Spring:實現bean定義時采用的“先進生產力”

品Spring:注解終於“成功上位”

品Spring:能工巧匠們對注解的“加持”

品Spring:SpringBoot和Spring到底有沒有本質的不同?

品Spring:負責bean定義注冊的兩個“排頭兵”

品Spring:SpringBoot輕松取勝bean定義注冊的“第一階段”

品Spring:SpringBoot發起bean定義注冊的“二次攻堅戰”

品Spring:注解之王@Configuration和它的一眾“小弟們”

品Spring:bean工廠后處理器的調用規則

品Spring:詳細解說bean后處理器

品Spring:對@PostConstruct和@PreDestroy注解的處理方法

品Spring:對@Resource注解的處理方法

品Spring:對@Autowired和@Value注解的處理方法

品Spring:真沒想到,三十步才能完成一個bean實例的創建

品Spring:關於@Scheduled定時任務的思考與探索,結果尷尬了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM