最近面試面試官都在問一些偏基礎(chǔ)又較為開放的問題,用來看看候選人基礎(chǔ)能力怎么樣,比如線程池,提問過程一般類似如下:
怎么使用線程池,得到的結(jié)果不出意外就是兩種:1.我不用線程池,工作中沒接觸過并發(fā);2.用Executors.newCachedThreadPool;
不管是哪一種回答,我還是希望能從候選人那里得到他們對線程池的理解,因此還是會問一下ThreadPoolExecutorService的幾個參數(shù)相關(guān)的問題,除了基礎(chǔ)非常差的候選人外,一般候選人都能回答上corePoolSize, maxPoolSize, BlockingQueue之間的關(guān)系:
corePoolSize是核心線程數(shù),maxPoolSize是最大線程數(shù),BlockingQueue是任務(wù)隊列
當有任務(wù)提交時,先創(chuàng)建corePoolSize數(shù)量的線程,有更多的任務(wù)則進入到BlockingQueue,BlockingQueue滿了還不夠則創(chuàng)建線程數(shù)直到macPoolSize
線程空閑一段時間后會被銷毀直到線程池中只剩下core數(shù)量的線程
回答出這幾個參數(shù)的作用以及他們之間的關(guān)系后,我一般會給一到兩個線程池相關(guān)的題,看看候選人是否能思考出,比如:
假如提交到線程池中的任務(wù),IO耗時占比是90%,計算耗時占比10%,忽略提交到線程池中的任務(wù)數(shù)量,在4C8G的機器上,理想情況下線程池中創(chuàng)建多少個線程是最優(yōu)的
一般平時只埋頭寫CURD的候選人,難以計算出來,當然也遇到了不少能算出來結(jié)果來的,線程數(shù)=(1/0.1) * 4 = 40,能算出來的候選人,我會問下其它問題,例如:
假如e有一類cpu密集性的任務(wù),沒有IO操作,日常的時候只有1個任務(wù),流量高峰會有50個任務(wù),4C8G的機器上,使用的線程池,如何設(shè)置corePoolSize, maxPoolSize以及BlockingQueue的大小
這樣的問題,我還沒有遇到能回答的候選人,一般得到類似于下的回答:
corePoolSize=4個線程,maxPoolSize大點100個,隊列大點,1萬2
個線程,隊列大點1千
…
因此我會對候選人做一些引導(dǎo),比如回答core=4, max=50, queue=1w的,我會問他他設(shè)置的maxPoolSize有沒有作用,明顯隊列設(shè)置成1w,這個隊列太大,根本就不會滿,maxPoolSize數(shù)量的線程永遠不會被創(chuàng)建,明顯候選人是隨意設(shè)置的,沒有經(jīng)過思考,這個時間我會讓他結(jié)合前面一個題再思考思考
這一步后,有些等候人開始回答出用4個線程,隊列50,但這樣并不是最優(yōu)的,因為日常每秒1個任務(wù)時,只需要一個線程就夠了,創(chuàng)建出4個線程,就有3個浪費
很顯然,日常只需要一個線程,那么corePoolSize=1,而高峰時候,雖然任務(wù)有50個,但是只是4C的機器,對于cpu密集型任務(wù),4個線程是最優(yōu)的,因此理想情況下maxCorePoolSize=4,最后再看看隊列,因為隊列滿了,max才會被創(chuàng)建,而我們需要讓max快速被創(chuàng)建出來,又不會出現(xiàn)任務(wù)拒絕,因此,可將隊列大小設(shè)置成46,那么線程池的行為如下:
提交第一個任務(wù),創(chuàng)建出core,1個線程
提交第二個到第47個任務(wù)時,這些任務(wù)進入到隊列中,此時隊列已滿
提交第48個任務(wù)到第50個任務(wù)時,創(chuàng)建出max,此時一共有4個線程
4個線程同時將隊列里的46個任務(wù)消費完
一段時間后,max - core數(shù)量的線程銷毀,即銷毀3個線程,還剩下一個線程
以上就是天津卓眾教育Java培訓(xùn)機構(gòu)小編介紹的“2020年Java軟件工程師面試題”的內(nèi)容,希望對大家有幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。
相關(guān)推薦
最新最全java面試題及答案(初級到高級)
史上最全的中高級JAVA工程師面試題及答案匯總
Java高級開發(fā)工程師面試題
2019史上最全java面試題題庫大全800題
哪有資深java工程師面試題