www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 單片機 > 架構(gòu)師社區(qū)
[導讀]前面文章中,我們總結(jié)了JVM18連環(huán)炮、并發(fā)并最基礎的12連環(huán)炮,建議先閱讀: 連環(huán)炮繼續(xù)走起,今天我給大家總結(jié)了線程池的12連環(huán)炮。

寫在前面

前面文章中,我們總結(jié)了JVM18連環(huán)炮、并發(fā)并最基礎的12連環(huán)炮,建議先閱讀:

連環(huán)炮繼續(xù)走起,今天我給大家總結(jié)了線程池的12連環(huán)炮。

1、為什么要創(chuàng)建線程池?

2、創(chuàng)建線程池有哪些方式?

3、Executors能創(chuàng)建幾種常用線程池?

4、線程池有哪些參數(shù)?

5,能說說線程池原理嗎?

6、線程池有哪些拒絕策略?

7、線程池中使用到了阻塞隊列,那你知道有哪些阻塞隊列?

8、線程池中的核心線程如何設置呢?

9、知道線程池有哪些狀態(tài)嗎?

10、線程池中的線程是如何復用的?

11、Java線程池中submit() 和 execute()方法有什么區(qū)別?

12、在工作中,有使用過線程池嗎?

1、為什么要創(chuàng)建線程池?

學了線程不懂線程池,那是遠遠不夠的,因為我們通常使用線程的時候,都會涉及到線程池。

數(shù)據(jù)庫也有連接池,也就是大家所講的池化技術。

線程也有線程池,對于池的概念大家一定把握好兩個關鍵:

  • 控制資源的數(shù)量
  • 重復利用資源

為什么要創(chuàng)建線程池,回答這個問題,我們可以說一下它的三個優(yōu)點。

第一個,降低資源消耗。通過重復利用線程池中的線程,能規(guī)避我們不斷創(chuàng)建線程和不斷銷毀線程造成的資源消耗。

第二個,提高響應速度。當任務到達線程池中,任務可以不需要等待線程創(chuàng)建就能立即執(zhí)行。

第三個,提高線程的可管理性。大家都知道,線程是稀缺資源,如果無限制的創(chuàng)建,不僅會消耗系統(tǒng)資源,還會降低系統(tǒng)的穩(wěn)定性。使用線程池,可以進行統(tǒng)一的分配、調(diào)優(yōu)和監(jiān)控。

回答完上面三個線程池的好處以后,面試官肯定會繼續(xù)問:創(chuàng)建線程池的方式有哪些?

2、創(chuàng)建線程池有哪些方式?

在java中創(chuàng)建線程有兩種方式:

  • Executors
  • ThreadPoolExecutor

這兩個都在juc目錄下面。其中,Executors可以理解為一個工具類,是用來生成線程池的。另外,Executors 的大部分創(chuàng)建線程方式最終使用的都是ThreadPoolExecutor。

并且在阿里規(guī)開發(fā)規(guī)范中,建議不要使用Executors 來創(chuàng)建線程池。因為線程池的類型以及線程相關參數(shù)都是在Executors 中就已經(jīng)封裝好了,如果我們在代碼中使用不當,可能會造成系統(tǒng)出問題。建議使用ThreadPoolExecutor創(chuàng)建線程,然后,根據(jù)自己的業(yè)務實際情況進行創(chuàng)建線程池。

3、Executors能創(chuàng)建幾種常用線程池?

上面我們說到,創(chuàng)建線程池的兩種方式。

其實,大部分面試官想要我們回答的是Executors 創(chuàng)建線程池的方式有哪幾種?所以肯定會繼續(xù)追問,Executors 創(chuàng)建線程池的幾種方式。今天就來看看,如何回答這個問題。

我們可以把Executors 類理解成為一個工廠類,該類可以為我們提供六種創(chuàng)建線程池的方法:

第1種,newSingleThreadExecutor,創(chuàng)建了一個單線程的線程池,此線程池保證了所有任務的執(zhí)行順序都是按照任務的提交順序執(zhí)行。也就是說,這個池子里只有一個線程。

第2種,newFixedThreadPool,創(chuàng)建指定數(shù)量線程的線程池;

第3種,newCachedThreadPool,創(chuàng)建一個可緩存的線程池,伸縮性、動態(tài)調(diào)整,60s回收一次;

第4種,newScheduledThreadPool,創(chuàng)建一個大小無限的線程池;

第5種,newSingleThreadScheduledExecutor(),創(chuàng)建一個單例線程池,定期或延時執(zhí)行任務,很多框架中使用此實現(xiàn)定時心跳檢測。

第6種,newWorkStealingPool,這是Java 8 新增創(chuàng)建線程池的方法。

回答完上面內(nèi)容后,面試就會問:線程池有哪些參數(shù)?

4、線程池有哪些參數(shù)?

這個問題也算是老掉牙的面試題,但是面試中頻率是相當高,經(jīng)久不衰。

線程池一共有7個參數(shù):

第1個,maximumPoolSize,指的是最大線程數(shù)

第2個,corePoolSize,指的是核心線程數(shù)

第3個,keepAliveTime ,指的是最大線程活躍時間

第4個,unit: 指定了keepAliveTime的單位,可以為毫秒,秒,分,小時等;

第5個,workQueue: 存儲未執(zhí)行的任務的隊列;

第6個,threadFactory: 創(chuàng)建線程的工廠,如果未指定則使用默認的線程工廠;

第7個,handler: 指定了當任務隊列已滿,并且沒有可用線程執(zhí)行任務時對新添加的任務的處理策略;

面試中,如果你能說出maximumPoolSize、corePoolSize、keepAliveTime 、workQueue、handler五個核心參數(shù)也算可以了,但還是建議大家把七個參數(shù)都回答出來。

5,能說說線程池原理嗎?

這道題,我本人在面試中最喜歡用生活中的例子來回答,請看我是怎么回答的:

一家工廠,訂單來了,正式員工們就開始生產(chǎn)零件。但是訂單越來越多,正式員工處理不來了,就先把任務放到倉庫里,但是遇到訂單爆棚的時候,倉庫也都放不下了,這時候,工廠就會想到找點臨時工來幫忙生產(chǎn)零件,如果訂單實在是太多了,這時候工廠可能就會想辦法拒絕那些不是很有利潤的訂單。同時,生意也有慘淡的時候,這時候工廠也許就會清理臨時工,讓他們等以后忙的時候再來幫忙。

在這里,訂單就是我們創(chuàng)建的線程,工廠就就是線程池,正式員工就是核心線程,臨時員工就是最大線程,倉庫就是阻塞隊列,訂單實在太多了,就會考慮到訂單的利潤,也就是說,利潤太少了那就不干了,這就是拒絕策略。

建議結(jié)合前面整體圖進行理解。

6、線程池有哪些拒絕策略?

線程池核心參數(shù)中,有個很重要的參數(shù)就是拒絕策略,面試官也是非常喜歡問的,大家可以這么回答。

線程池中主要有4種拒絕策略:

第1種,AbortPolicy,這是默認策略,指的是丟棄任務,拋出異常;

第2種,CallerRunsPolicy,簡單的說,就是后面排隊的線程就在那等著,被拒絕的任務在主線程中運行,所以主線程就被阻塞了,別的任務只能在被拒絕的任務執(zhí)行完后,才會繼續(xù)被提交到線程池中。

第3種,DiscardOldestPolicy,指的是丟棄等待隊列中最久的任務,并且執(zhí)行當前任務;

第4種,DiscardPolicy,直接丟棄任務,也不拋異常。

我們說完了線程池核心參數(shù)中一個拒絕策略,也有的面試官喜歡問另外一個參數(shù),那就是阻塞隊列。

7、線程池中使用到了阻塞隊列,那你知道有哪些阻塞隊列?

這個問題,也屬于java集合框架的內(nèi)容,所以,還是很有必要掌握的。

JDK7及以后一共有7種阻塞隊列:

第1種,ArrayBlockingQueue ,由數(shù)組結(jié)構(gòu)組成的有界阻塞隊列。

第2種,LinkedBlockingQueue ,由鏈表結(jié)構(gòu)組成的有界阻塞隊列。

第3種,PriorityBlockingQueue ,支持優(yōu)先級排序的無界阻塞隊列。

第4種,DelayQueue,使用優(yōu)先級隊列實現(xiàn)的無界阻塞隊列。

第5種,SynchronousQueue,不存儲元素的阻塞隊列。

第6種,LinkedTransferQueue,由鏈表結(jié)構(gòu)組成的無界阻塞隊列。

第7種,LinkedBlockingDeque,由鏈表結(jié)構(gòu)組成的雙向阻塞隊列。

另外,Executors 中使用最多的是LinkedBlockingDeque,還用了SynchronousQueue。

回答完以上七種后,請記住把Executors 中使用的兩種也強調(diào)一下,表示你對此非常熟悉。

還有可能會繼續(xù)問一個非常重要的參數(shù),那就是核心線程數(shù)。

8、線程池中的核心線程如何設置呢?

回答這個問題,我們首先得知道,線程和CPU有關,所以,如何設置核心線程數(shù),肯定也是和CPU有關的,核心線程數(shù)設置和任務的類型也有關,任務類型有兩種:

一種是CPU密集型, 比如像加解密、壓縮、計算等一系列需要大量耗費 CPU 資源的任務,大部分場景下都是純 CPU 計算。所以,核心線程數(shù)可以設置為:核心線程數(shù)=CPU個數(shù)+1。

另外一種,就是IO密集型, 比如像 MySQL 數(shù)據(jù)庫、文件的讀寫、網(wǎng)絡通信等任務,這類任務不會特別消耗 CPU 資源,但是 IO 操作比較耗時,會占用比較多的時間。所以,核心線程數(shù)可以設置為:核心線程數(shù) = CPU個數(shù)*2。

這個只是個理論值,具體設置大小,建議在本地、測試、準生產(chǎn)環(huán)境下調(diào)試出相對最優(yōu)參數(shù)大小。

回答完這些后,有的面試官可能會問:你知道線程池的狀態(tài)嗎?

9、知道線程池有哪些狀態(tài)嗎?

很多人,平時估計都不知道線程池居然也有狀態(tài),都只知道線程狀態(tài)。所以這種問題如果不準備,只要被問到必掛。

線程池有5種狀態(tài),

第1種,RUNNING,指的是線程池的初始化狀態(tài),可添加待執(zhí)行的任務。

第2種,SHUTDOWN,指的是線程池處于待關閉狀態(tài),不接收新任務,僅處理已接收的任務。

第3種,STOP,指的是線程池立即關閉,不接收新的任務,放棄緩存隊列中的任務并且中斷正在處理的任務。

第4種,TIDYING,指的是線程池自主整理狀態(tài),我們可以調(diào)用 terminated() 方法進行線程池整理。

第5種,TERMINATED,指的是線程池終止狀態(tài)。

回答完線程池狀態(tài)后,下面這個問題是非常經(jīng)典的,也基本上是問中高級的。

10、線程池中的線程是如何復用的?

這里的線程復用指的是線程池的中線程被重復利用,這里注意了,很多人也許都還沒明白這點!再強調(diào)一次,

我們手動創(chuàng)建的線程放到線程池中,其實,這時候它變成了一個任務。

線程池執(zhí)行這些任務的時候,不再是調(diào)用線程(任務)的start()方法,而是由線程池中的線程去執(zhí)行這些任務。

然后線程池中的這些線程就不斷地去循環(huán),執(zhí)行我們丟進去的任務,并調(diào)用這些任務的run()方法。此時調(diào)用的run()方法就相當于調(diào)用一個普通對象的put方法,通過重復使用這些固定線程來執(zhí)行所有任務。

11、Java線程池中submit() 和 execute()方法有什么區(qū)別?

不知道你是否還記得,我們創(chuàng)建線程,然后把線程提交到線程池中時候,通常有兩種方法:submit和execute。所以面試官很有可能會問這個問題,這個問題也很有可能出現(xiàn)在筆試中。

回答這個問題,我們得先說說兩者的相同點,

submit() 和 execute()方法都是用來提交任務的,指的是把我們創(chuàng)建的任務提交到線程池中。

兩者的不同點在于,調(diào)用 execute() 方法提交任務不能拿到任務的返回值,而調(diào)用 submit() 可以使用 Future 接收線程池執(zhí)行任務的返回值。

這里就可以聯(lián)想到,我們創(chuàng)建線程的方式中,有的方式可以拿到線程返回值,有的拿不到。

另外,execute()方法是ThreadPoolExecutor的方法,而submit() 方法是ThreadPoolExecutor的父類AbstractExecutorService中的方法。

12、在工作中,有使用過線程池嗎?

這道問題,對于99%的人都很害怕,因為工作中可能真的沒用過,所以,心里很沒底兒。有的人用過了,卻沒注意項目中是怎么樣用,可能是組長或者其他人寫了個工具類,自己用也是拷貝別人代碼改改,然后也挺好的。

其實大家可以編造自己的業(yè)務場景哈,即使沒有,你也可以自己編造點呀,不圖羊嘛。這世道就是套路多多滴。這個沒有具體答案,答案還得靠你結(jié)合你所做項目來回答哈。

免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅(qū)動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅(qū)動性能的關鍵。

關鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅(qū)動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關鍵字: LED 驅(qū)動電源 開關電源

LED驅(qū)動電源是把電源供應轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅(qū)動電源
關閉