溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

線程池有哪些經(jīng)典面試題

發(fā)布時(shí)間:2020-07-31 17:05:08 來(lái)源:億速云 閱讀:281 作者:Leah 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)線程池有哪些經(jīng)典面試題,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

面試題1:使用線程池有哪些好處?

答案:降低資源消耗,通過(guò)重復(fù)利用已創(chuàng)建的線程,降低線程創(chuàng)建和銷毀造成的消耗;提高響應(yīng)速度,當(dāng)任務(wù)到達(dá)時(shí),任務(wù)可以不需要等到線程創(chuàng)建就能立即執(zhí)行;增加線程的可管理型,線程是稀缺資源,使用線程池可以進(jìn)行統(tǒng)一分配,調(diào)優(yōu)和監(jiān)控。

面試題2:概述一下線程池的核心屬性。

答案:

1)線程工廠:用于創(chuàng)建工作線程的工廠。

2)核心線程數(shù):當(dāng)線程池運(yùn)行的線程少于 corePoolSize 時(shí),將創(chuàng)建一個(gè)新線程來(lái)處理請(qǐng)求,即使其他工作線程處于空閑狀態(tài)。

3)隊(duì)列:用于保留任務(wù)并移交給工作線程的阻塞隊(duì)列。

4)最大線程數(shù):線程池允許開啟的最大線程數(shù)。

5)拒絕策略:往線程池添加任務(wù)時(shí),將在下面兩種情況觸發(fā)拒絕策略:一是線程池運(yùn)行狀態(tài)不是 RUNNING;二是線程池已經(jīng)達(dá)到最大線程數(shù),并且阻塞隊(duì)列已滿時(shí)。

6)保持存活時(shí)間:如果線程池當(dāng)前線程數(shù)超過(guò) corePoolSize,則多余的線程空閑時(shí)間超過(guò) keepAliveTime 時(shí)會(huì)被終止。

面試題3:線程池有哪些狀態(tài)?分別描述一下。

答案:

1RUNNING:接受新任務(wù)并處理排隊(duì)的任務(wù)。

2SHUTDOWN:不接受新任務(wù),但處理排隊(duì)的任務(wù)。

3STOP:不接受新任務(wù),不處理排隊(duì)的任務(wù),并中斷正在進(jìn)行的任務(wù)。

4TIDYING:所有任務(wù)都已終止,workerCount 為零,線程轉(zhuǎn)換到 TIDYING 狀態(tài)將運(yùn)行 terminated() 鉤子方法。

5TERMINATEDterminated() 已完成。

 

面試題4:線程池有哪些常見的阻塞隊(duì)列?使用時(shí)要注意什么?

答案:

1ArrayBlockingQueue:基于數(shù)組結(jié)構(gòu)的有界阻塞隊(duì)列,按先進(jìn)先出對(duì)元素進(jìn)行排序。

2LinkedBlockingQueue:基于鏈表結(jié)構(gòu)的有界/無(wú)界阻塞隊(duì)列,按先進(jìn)先出對(duì)元素進(jìn)行排序,吞吐量通常高于 ArrayBlockingQueue。Executors.newFixedThreadPool 使用了該隊(duì)列。

3SynchronousQueue:不是一個(gè)真正的隊(duì)列,而是一種在線程之間移交的機(jī)制。要將一個(gè)元素放入 SynchronousQueue 中,必須有另一個(gè)線程正在等待接受這個(gè)元素。如果沒有線程等待,并且線程池的當(dāng)前大小小于最大值,那么線程池將創(chuàng)建一個(gè)線程,否則根據(jù)拒絕策略,這個(gè)任務(wù)將被拒絕。使用直接移交將更高效,因?yàn)槿蝿?wù)會(huì)直接移交給執(zhí)行它的線程,而不是被放在隊(duì)列中,然后由工作線程從隊(duì)列中提取任務(wù)。只有當(dāng)線程池是無(wú)界的或者可以拒絕任務(wù)時(shí),該隊(duì)列才有實(shí)際價(jià)值。

4PriorityBlockingQueue:具有優(yōu)先級(jí)的無(wú)界隊(duì)列,按優(yōu)先級(jí)對(duì)元素進(jìn)行排序。元素的優(yōu)先級(jí)是通過(guò)自然順序或 Comparator 來(lái)定義的。

使用有界隊(duì)列時(shí),需要注意線程池滿了后,被拒絕的任務(wù)如何處理。使用無(wú)界隊(duì)列時(shí),需要注意如果任務(wù)的提交速度大于線程池的處理速度,可能會(huì)導(dǎo)致內(nèi)存溢出。

 

面試題5:終止線程池有哪些方式?

答案:

1shutdown:“溫柔”的關(guān)閉線程池。不接受新任務(wù),但是在關(guān)閉前會(huì)將之前提交的任務(wù)處理完畢。

2shutdownNow:“粗暴”的關(guān)閉線程池,也就是直接關(guān)閉線程池,通過(guò) Thread#interrupt() 方法終止所有線程,不會(huì)等待之前提交的任務(wù)執(zhí)行完畢。但是會(huì)返回隊(duì)列中未處理的任務(wù)。

面試題6:在我們實(shí)際使用中,線程池的大小配置多少合適?

答案:要想合理的配置線程池大小,首先我們需要區(qū)分任務(wù)是計(jì)算密集型還是I/O密集型。對(duì)于計(jì)算密集型,設(shè)置 線程數(shù) = CPU數(shù) + 1,通常能實(shí)現(xiàn)最優(yōu)的利用率。對(duì)于I/O密集型,網(wǎng)上常見的說(shuō)法是設(shè)置 線程數(shù) = CPU數(shù) * 2 ,這個(gè)做法是可以的,但不是最優(yōu)的。

 在我們?nèi)粘5拈_發(fā)中,我們的任務(wù)幾乎是離不開I/O的,常見的網(wǎng)絡(luò)I/ORPC調(diào)用)、磁盤I/O(數(shù)據(jù)庫(kù)操作),并且I/O的等待時(shí)間通常會(huì)占整個(gè)任務(wù)處理時(shí)間的很大一部分,在這種情況下,開啟更多的線程可以讓 CPU 得到更充分的使用,一個(gè)較合理的計(jì)算公式如下:

 線程數(shù) = CPU數(shù) * CPU利用率 * (任務(wù)等待時(shí)間 / 任務(wù)計(jì)算時(shí)間 + 1)

 例如我們有個(gè)定時(shí)任務(wù),部署在4核的服務(wù)器上,該任務(wù)有100ms在計(jì)算,900msI/O等待,則線程數(shù)約為:4 * 1 * (1 + 900 / 100) = 40個(gè)。當(dāng)然,具體我們還要結(jié)合實(shí)際的使用場(chǎng)景來(lái)考慮。

關(guān)于線程池有哪些經(jīng)典面試題就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI