助力金三銀四之Java中的線程池七個參數

程序猿辣油 發佈 2024-03-16T13:02:34.226505+00:00

前言在上篇文章中,基於面試官問的一個問題,我們已經成功引導面試官問出了我們精心準備的第二個問題線程池中的七個參數是什麼,具體有什麼用?這個時候我們就要好好準備我們的答案,以及如何引導面試官問出我們準備的第三個問題。

前言

在上篇文章中,基於面試官問的一個問題,我們已經成功引導面試官問出了我們精心準備的第二個問題線程池中的七個參數是什麼,具體有什麼用?這個時候我們就要好好準備我們的答案,以及如何引導面試官問出我們準備的第三個問題。

舉個栗子

枯燥的直接說七個參數是什麼可能令人無法理解,也不利於長期記憶。這裡我準備了個例子,幫助大家更好的理解。假設我們現在擁有個神奇的盒子,當盒子裡面放滿文件時,我們可以在盒子上面繼續放置文件,當盒子上面也放滿時,它會自動在生成一個跟他大小一樣的空盒子供我們繼續放文件,當生成的盒子10分鐘沒人放置文件時,它又會自動消失。

這個時候我們就可以想像一個場景,當我們向這個盒子一個個放文件的時候,當我們把盒子裡面放滿時,我們還可以把文件放在盒子上面,當盒子上面也放滿時,這個時候就會產生一個新的盒子,我們可以繼續往新盒子裡面放文件。當把新盒子也放滿了,此時不會再產生一個新的盒子,我們還想再往盒子裡面存放東西時,這個時候盒子就會跳起來給我們一巴掌,告訴我們已經放不下了。此時我們開始從盒子裡拿文件,不一會就把第二個盒子拿光了,過了十分鐘,盒子發現它已經空了,就自動消失了。

主食上桌

理解了上面的例子,此時我們再來聊聊線程池的七個參數。我們所說的七個參數,其實就是ThreadPoolExecutor對象構造函數的七個參數。

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionhandler handler) 

藉助上面的例子,我們來聊聊這七個函數的作用。

corePoolSize核心線程的個數,即我們上面說的一個盒子裡面能放文件的個數。線程池保證裡面的線程數不會少於這個數量。

maximumPoolSize最大線程的個數,即我們上面說的最多產生兩個盒子。線程池裡面最多的線程數量。

keepAliveTime和unit非核心線程空閒銷毀的時間和單位,即我們上面所說的新產生的盒子沒有存放文件時,多久會消失。只會影響非核心線程。

workQueue隊列,即我們上面說的盒子上面可以放的文件的個數。當核心線程數用完以後,再有任務來的時候,不會立即創建線程,而是會先把任務放到隊列中。

threadFactory線程創建工廠,即我們上面的盒子是如何產生的。一般通過這個來給線程指定名字,方便出現問題時定位問題。

handler拒絕策略,即上文中的盒子裡面和上面都放滿了,盒子會抽我們一巴掌。

飯後甜點

和面試官聊完上面七個參數後,可以繼續深入說下線程池處理任務的邏輯,當我們提交一個任務到線程池中的時候,線程池首先會判斷核心線程是否已經用完;當核心線程用完後,此時不會立即生成額外的線程,而是會優先將任務放入隊列中;當隊列也被任務放滿時,此時會產生額外的線程到最大線程數;如果此時還有任務過來,就會執行拒絕策略。這時我們可以把JDK提供的四種拒絕策略也說下,大家表達出意思即可,不用強行記憶英文單詞。

AbortPolicy直接丟棄任務,拋出異常,這是默認策略。

DiscardPolicy直接丟棄任務,不拋出異常

CallerRunsPolicy調用者線程執行

DiscardOldestPolicy丟棄隊列中最先插入的任務

結尾

到這裡這個問題就回答完畢了,但是基於我們前面所說的,我們需要引導面試官問我們知道的問題,那麼到這裡我們可以引導面試官問什麼問題呢?其實說到線程逃避不開的問題就是線程的生命周期,那麼在回答上面的問題過程中我們可以有意無意的提到這點,在下期我將詳細給大家講解線程生命周期的說法,相信能給大家帶來不一樣的觀點。

歡迎大家在評論區發表大家還想了解的內容,如果各位客官覺得筆者的文章對大家有幫助,也非常歡迎大家關注加轉發,筆者將持續為大家帶來Java面試的一些問題的回答和常用的面試技巧,相信一定能為大家拿到滿意的Offer貢獻一份力量。

關鍵字: