1. 程式人生 > >執行緒池開門營業招聘開發人員的一天

執行緒池開門營業招聘開發人員的一天


執行緒池一大早就來到了公司,進到了屬於自己的“經理”辦公室,時間才剛剛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定時任務的思考與探索,結果尷尬了