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

来源:https://www.cnblogs.com/lixinjie/archive/2019/12/15/a-story-about-thread-pool-as-if-they-were-people.html
-Advertisement-
Play Games

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

    

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

 

畢業10年,我有話說

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

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

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

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

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

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

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

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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Java編譯時常量和運行時常量 編譯期常量指的就是程式在編譯時就能確定這個常量的具體值。 非編譯期常量就是程式在運行時才能確定常量的值,因此也稱為運行時常量。 在Java中,編譯期常量指的是用final關鍵字修飾的基本類型或String類型並直接賦值(非複雜運算)的變數(無論是否用static修飾) ...
  • nats的消息傳遞模型 @[toc] What is NATS nats是一個go語言開發的開源的、輕量、高性能的原生消息系統。nats消息由主題處理,不依賴於網路位置。它提供了應用程式或服務與底層物理網路之間的抽象層。數據被編碼並作為消息,由發佈者發送。消息由一個或多個訂閱者接收、解碼和處理。 N ...
  • 綜述 TensorFlow程式分為構建階段和執行階段。通過構建一個圖、執行這個圖來得到結果。 構建圖 創建源op,源op不需要任何輸入,例如常量 ,源op的輸出被傳遞給其他op做運算。 在一個會話中啟動圖 構造圖之後,需要創建 對象來啟動圖。 使用“with”代碼塊來自動完成關閉動作。 Tensor ...
  • 實現一個基於web技術的電影票訂票網站,故而系統主要以j2EE作為開發基礎,主要使用了struts2+spring+hibernate等多種框架的結合使用,用myeclipse作為開發工具,以MYSQL作為資料庫,以Macromedia公司的Dreamweaver作為界面美化工具,使用JAVA語言開 ...
  • 寫在前面 在我初次接觸MongoDB的時候,是為了做一個監控系統和日誌分析系統。當時在用Java操作MongoDB數據里的數據的時候,都是在網上查找Demo示例然後完成的功能,相信大家也同樣的體會,網上大都是這種一個入門的小Demo,很少有深入講解的。功能調通後,自己琢磨效率方面的問題,便開始自己的 ...
  • 大家都知道,Java中JVM的重要性,學習了JVM你對Java的運行機制、編譯過程和如何對Java程式進行調優相信都會有一個很好的認知。 廢話不多說,直接帶大家來初步認識一下JVM。 什麼是JVM? JVM(Java Virtual Machine)是一個抽象的電腦,和實際的電腦一樣,它具有指令 ...
  • 猜數字小游戲 1 # coding:utf-8 2 import random 3 4 5 #利用random生成一個1-10的隨機數 6 luckeyNum = random.randint(1,10) 7 8 #限定猜的次數 9 limitCount = 3 10 11 while limitC ...
  • 新聞 "Azure Functions 3.0系統上線" "GC性能架構——第1部分" "ConfigureAwait問題解答" "介紹System.Threading.Channels" "Windows Server Core容器鏡像小了40%" "F 性能提示和技巧" 視頻及幻燈片 "語言與運 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...