溫馨提示×

溫馨提示×

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

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

線程的相關(guān)知識點(diǎn)總結(jié)

發(fā)布時(shí)間:2021-10-14 14:41:10 來源:億速云 閱讀:136 作者:iii 欄目:編程語言

這篇文章主要介紹“線程的相關(guān)知識點(diǎn)總結(jié)”,在日常操作中,相信很多人在線程的相關(guān)知識點(diǎn)總結(jié)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”線程的相關(guān)知識點(diǎn)總結(jié)”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

先說阻塞隊(duì)列,即生產(chǎn)者消費(fèi)者模式

舉個列子

線程的相關(guān)知識點(diǎn)總結(jié)

在多線程下:所謂阻塞,在某些情況下會掛起線程(即阻塞),一旦條件滿足,被掛起的線程又會自動被喚醒。

為什么需要BlockingQueue?
好處是我們不需要關(guān)心什么時(shí)候需要阻塞線程,什么時(shí)候需要喚醒線程,因?yàn)檫@一切BlockingQueue都給你辦了。在concurrent包發(fā)布以前,在多線程環(huán)境下,我們每個程序員都必須去自己控制這些細(xì)節(jié),尤其還要兼顧效率和線程安全,而這會給我們的程序帶來不小的復(fù)雜度。

線程池的底層就是阻塞隊(duì)列:

ArrayBlockingQueue:由數(shù)組結(jié)構(gòu)組成的有界阻塞隊(duì)列。
LinkedBlockingQueue:由鏈表結(jié)構(gòu)組成的有界(默認(rèn)值為Integer.MAX_VALUE)阻塞隊(duì)列。
PriorityBlockingQueue:支持優(yōu)先級排序的無界塞隊(duì)列。
DelayQueue:使用優(yōu)先級隊(duì)列實(shí)現(xiàn)的延遲無界阻塞隊(duì)列。
SynchronousQueue:不存儲元素的阻塞隊(duì)列,也即單個元素的隊(duì)列。
LinkedTransferQueue:由鏈表結(jié)構(gòu)組成的無界阻塞隊(duì)列。
LinkedBlockingDeque:由鏈表結(jié)構(gòu)組成的雙向阻塞隊(duì)列

線程的相關(guān)知識點(diǎn)總結(jié)

線程的相關(guān)知識點(diǎn)總結(jié)

說一下SynchronousQueue,與其他BlockingQueue不同,SynchronousQueue是一個不存儲元素的BlockingQueue(沒有容量)。
每一個put操作必須要等待一個take操作,否則不能繼續(xù)添加元素,反之亦然。

創(chuàng)建線程的幾種方式

1.繼承Thread類

2.實(shí)現(xiàn)Runable接口

3.實(shí)現(xiàn)Callable接口

Callable  FutureTask實(shí)現(xiàn)了Runable接口,構(gòu)造方法傳入Callable(適配器模式)。面向接口的編程。

4.線程池…..

ThreadPoolExecutor  + 阻塞隊(duì)列

1、newCachedThreadPool:用來創(chuàng)建一個可以無限擴(kuò)大的線程池,適用于負(fù)載較輕的場景,執(zhí)行短期異步任務(wù)。(可以使得任務(wù)快速得到執(zhí)行,因?yàn)槿蝿?wù)時(shí)間執(zhí)行短,可以很快結(jié)束,也不會造成cpu過度切換)

2、newFixedThreadPool:創(chuàng)建一個固定大小的線程池,因?yàn)椴捎脽o界的阻塞隊(duì)列,所以實(shí)際線程數(shù)量永遠(yuǎn)不會變化,適用于負(fù)載較重的場景,對當(dāng)前線程數(shù)量進(jìn)行限制。(保證線程數(shù)可控,不會造成線程過多,導(dǎo)致系統(tǒng)負(fù)載更為嚴(yán)重)

3、newSingleThreadExecutor:創(chuàng)建一個單線程的線程池,適用于需要保證順序執(zhí)行各個任務(wù)。

4、newScheduledThreadPool:適用于執(zhí)行延時(shí)或者周期性任務(wù)。

核心參數(shù)

1.corePoolSize:線程池中的常駐核心線程數(shù)
2.maximumPooISize:線程池能夠容納同時(shí)執(zhí)行的最大線程數(shù),此值必須大于等于1
3.keepAliveTime:多余的空閑線程的存活時(shí)間。當(dāng)前線程池?cái)?shù)量超過corepooISize時(shí),當(dāng)空閑時(shí)間達(dá)到keepAeTime值時(shí),多余空閑線程會被銷毀直到只剩下corepooISize個線程為止
4.unit:keepAliveTime的單位
5.workQueue:任務(wù)隊(duì)列,被提交但尚未被執(zhí)行的任務(wù)
6.threadFactory:表示生成線程池中工作線程的線程工廠,用于創(chuàng)建線程一般用默認(rèn)的即可
7.handIer:拒絕策略,表示當(dāng)隊(duì)列滿了并且工作線程大于等于線程池的最大線程數(shù)(maximumPooISize)

底層原理

1. 在創(chuàng)建了線程池后,等待提交過來的任務(wù)請求。
2. 當(dāng)調(diào)用execute()方法添加一個請求任務(wù)時(shí),線程池會做如下判斷:
    2.1如果正在運(yùn)行的線程數(shù)量小于corePoolSize,那么直接創(chuàng)建線程運(yùn)行這個任務(wù);
    2.2如果正在運(yùn)行的線程數(shù)量大于或等于corePoolSize,那么將這個任務(wù)放入隊(duì)列;
    2.3如果這時(shí)候隊(duì)列滿了且正在運(yùn)行的線程數(shù)量還小于maximumPoolSze,那么還是要創(chuàng)建非核心線程立刻運(yùn)行這個任務(wù);
    2.4如果隊(duì)列滿了且正在運(yùn)行的線程數(shù)量大于或等于maximumPoolSze,那么線程池會啟動飽和拒絕略來執(zhí)行。
3. 當(dāng)一個線程完成任務(wù)時(shí),它會從隊(duì)列中取下一個任務(wù)來執(zhí)行。
4. 當(dāng)一個線程無事可做超過一定的時(shí)間(keepAliveTime)時(shí),線程池會判斷:|
    如果當(dāng)前運(yùn)行的線程數(shù)大于corePoolSize,那么這個線程就被停掉。所以線程池的所有任務(wù)完成后它最終會收縮到corePoolStze的大小。

拒絕策略

AbortPolicy(默認(rèn)):直拋出RejectedExecutionExcepton異常阻止系統(tǒng)正常運(yùn)行。
CallerRunsPolicy:“調(diào)用者運(yùn)行”一種調(diào)節(jié)機(jī)制,該策略既不會拋棄任務(wù),也不會拋出異常,而是將某些任務(wù)回退給調(diào)用者運(yùn)行。
DiscardOldestPolicy:拋棄隊(duì)列中等待最久的任務(wù),然后把當(dāng)前任務(wù)加入隊(duì)中嘗試再次提交當(dāng)前任務(wù)。
DiscardPolicy:直接丟棄任務(wù),不予任何處理也不拋出異常。如果允許任務(wù)丟失,這是最好的一種方案。

擴(kuò)展:合理配置線程,你是如何考慮的?

 1.cpu密集型

CPU密集的意思是該任務(wù)需要大量的運(yùn)算,而沒有阻塞,CPU一直全速運(yùn)行。
CPU密集任務(wù)只有在真正的多核CPU上才可能得到加速(通過多線程),而在單核CPU上,無論你開幾個模擬的多線程該任務(wù)都不可能得到加速,因?yàn)镃PU總的運(yùn)算能力就那些。
因?yàn)镃PU密集型任務(wù)使得CPU使用率很高,若開過多的線程數(shù),會造成CPU過度切換,所以CPU密集型任務(wù)配置盡可能少的線程數(shù)量:
一般公式:CPU核數(shù)+1個線程的線程池

2.io密集型

可以使用稍大的線程池,一般為2*CPU核心數(shù)。 IO密集型任務(wù)CPU使用率并不高,因此可以讓CPU在等待IO的時(shí)候有其他線程去處理別的任務(wù),充分利用CPU時(shí)間。

故需要多配置線程數(shù):
參公式:CPU核數(shù)/1-阻塞系數(shù)    阻塞系數(shù)在0.8~0.9之間
比如8核CPU:8/1-0.9=80個線程數(shù)

線程池為什么要使用阻塞隊(duì)列?

1.因?yàn)榫€程若是無限制的創(chuàng)建,可能會導(dǎo)致內(nèi)存占用過多而產(chǎn)生OOM,并且會造成cpu過度切換。

2.阻塞隊(duì)列可以保證任務(wù)隊(duì)列中沒有任務(wù)時(shí)阻塞獲取任務(wù)的線程,使得線程進(jìn)入wait狀態(tài),釋放cpu資源。當(dāng)隊(duì)列中有任務(wù)時(shí)才喚醒對應(yīng)線程從隊(duì)列中取出消息進(jìn)行執(zhí)行。使得在線程不至于一直占用cpu資源。  

到此,關(guān)于“線程的相關(guān)知識點(diǎn)總結(jié)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

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

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

AI