您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關線程池有哪些經典面試題,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
面試題1:使用線程池有哪些好處?
答案:降低資源消耗,通過重復利用已創建的線程,降低線程創建和銷毀造成的消耗;提高響應速度,當任務到達時,任務可以不需要等到線程創建就能立即執行;增加線程的可管理型,線程是稀缺資源,使用線程池可以進行統一分配,調優和監控。
面試題2:概述一下線程池的核心屬性。
答案:
(1)線程工廠:用于創建工作線程的工廠。
(2)核心線程數:當線程池運行的線程少于 corePoolSize 時,將創建一個新線程來處理請求,即使其他工作線程處于空閑狀態。
(3)隊列:用于保留任務并移交給工作線程的阻塞隊列。
(4)最大線程數:線程池允許開啟的最大線程數。
(5)拒絕策略:往線程池添加任務時,將在下面兩種情況觸發拒絕策略:一是線程池運行狀態不是 RUNNING;二是線程池已經達到最大線程數,并且阻塞隊列已滿時。
(6)保持存活時間:如果線程池當前線程數超過 corePoolSize,則多余的線程空閑時間超過 keepAliveTime 時會被終止。
面試題3:線程池有哪些狀態?分別描述一下。
答案:
(1)RUNNING:接受新任務并處理排隊的任務。
(2)SHUTDOWN:不接受新任務,但處理排隊的任務。
(3)STOP:不接受新任務,不處理排隊的任務,并中斷正在進行的任務。
(4)TIDYING:所有任務都已終止,workerCount 為零,線程轉換到 TIDYING 狀態將運行 terminated() 鉤子方法。
(5)TERMINATED:terminated() 已完成。
面試題4:線程池有哪些常見的阻塞隊列?使用時要注意什么?
答案:
(1)ArrayBlockingQueue:基于數組結構的有界阻塞隊列,按先進先出對元素進行排序。
(2)LinkedBlockingQueue:基于鏈表結構的有界/無界阻塞隊列,按先進先出對元素進行排序,吞吐量通常高于 ArrayBlockingQueue。Executors.newFixedThreadPool 使用了該隊列。
(3)SynchronousQueue:不是一個真正的隊列,而是一種在線程之間移交的機制。要將一個元素放入 SynchronousQueue 中,必須有另一個線程正在等待接受這個元素。如果沒有線程等待,并且線程池的當前大小小于最大值,那么線程池將創建一個線程,否則根據拒絕策略,這個任務將被拒絕。使用直接移交將更高效,因為任務會直接移交給執行它的線程,而不是被放在隊列中,然后由工作線程從隊列中提取任務。只有當線程池是無界的或者可以拒絕任務時,該隊列才有實際價值。
(4)PriorityBlockingQueue:具有優先級的無界隊列,按優先級對元素進行排序。元素的優先級是通過自然順序或 Comparator 來定義的。
使用有界隊列時,需要注意線程池滿了后,被拒絕的任務如何處理。使用無界隊列時,需要注意如果任務的提交速度大于線程池的處理速度,可能會導致內存溢出。
面試題5:終止線程池有哪些方式?
答案:
(1)shutdown:“溫柔”的關閉線程池。不接受新任務,但是在關閉前會將之前提交的任務處理完畢。
(2)shutdownNow:“粗暴”的關閉線程池,也就是直接關閉線程池,通過 Thread#interrupt() 方法終止所有線程,不會等待之前提交的任務執行完畢。但是會返回隊列中未處理的任務。
面試題6:在我們實際使用中,線程池的大小配置多少合適?
答案:要想合理的配置線程池大小,首先我們需要區分任務是計算密集型還是I/O密集型。對于計算密集型,設置 線程數 = CPU數 + 1,通常能實現最優的利用率。對于I/O密集型,網上常見的說法是設置 線程數 = CPU數 * 2 ,這個做法是可以的,但不是最優的。
在我們日常的開發中,我們的任務幾乎是離不開I/O的,常見的網絡I/O(RPC調用)、磁盤I/O(數據庫操作),并且I/O的等待時間通常會占整個任務處理時間的很大一部分,在這種情況下,開啟更多的線程可以讓 CPU 得到更充分的使用,一個較合理的計算公式如下:
線程數 = CPU數 * CPU利用率 * (任務等待時間 / 任務計算時間 + 1)
例如我們有個定時任務,部署在4核的服務器上,該任務有100ms在計算,900ms在I/O等待,則線程數約為:4 * 1 * (1 + 900 / 100) = 40個。當然,具體我們還要結合實際的使用場景來考慮。
關于線程池有哪些經典面試題就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。