真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的桑日網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

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

舉個(gè)列子

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

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

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

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

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

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

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

說一下SynchronousQueue,與其他BlockingQueue不同,SynchronousQueue是一個(gè)不存儲(chǔ)元素的BlockingQueue(沒有容量)。
每一個(gè)put操作必須要等待一個(gè)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)建一個(gè)可以無限擴(kuò)大的線程池,適用于負(fù)載較輕的場(chǎng)景,執(zhí)行短期異步任務(wù)。(可以使得任務(wù)快速得到執(zhí)行,因?yàn)槿蝿?wù)時(shí)間執(zhí)行短,可以很快結(jié)束,也不會(huì)造成cpu過度切換)

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

3、newSingleThreadExecutor:創(chuàng)建一個(gè)單線程的線程池,適用于需要保證順序執(zhí)行各個(gè)任務(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í),多余空閑線程會(huì)被銷毀直到只剩下corepooISize個(gè)線程為止
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ù)請(qǐng)求。
2. 當(dāng)調(diào)用execute()方法添加一個(gè)請(qǐng)求任務(wù)時(shí),線程池會(huì)做如下判斷:
    2.1如果正在運(yùn)行的線程數(shù)量小于corePoolSize,那么直接創(chuàng)建線程運(yùn)行這個(gè)任務(wù);
    2.2如果正在運(yùn)行的線程數(shù)量大于或等于corePoolSize,那么將這個(gè)任務(wù)放入隊(duì)列;
    2.3如果這時(shí)候隊(duì)列滿了且正在運(yùn)行的線程數(shù)量還小于maximumPoolSze,那么還是要?jiǎng)?chuàng)建非核心線程立刻運(yùn)行這個(gè)任務(wù);
    2.4如果隊(duì)列滿了且正在運(yùn)行的線程數(shù)量大于或等于maximumPoolSze,那么線程池會(huì)啟動(dòng)飽和拒絕略來執(zhí)行。
3. 當(dāng)一個(gè)線程完成任務(wù)時(shí),它會(huì)從隊(duì)列中取下一個(gè)任務(wù)來執(zhí)行。
4. 當(dāng)一個(gè)線程無事可做超過一定的時(shí)間(keepAliveTime)時(shí),線程池會(huì)判斷:|
    如果當(dāng)前運(yùn)行的線程數(shù)大于corePoolSize,那么這個(gè)線程就被停掉。所以線程池的所有任務(wù)完成后它最終會(huì)收縮到corePoolStze的大小。

拒絕策略

AbortPolicy(默認(rèn)):直拋出RejectedExecutionExcepton異常阻止系統(tǒng)正常運(yùn)行。
CallerRunsPolicy:“調(diào)用者運(yùn)行”一種調(diào)節(jié)機(jī)制,該策略既不會(huì)拋棄任務(wù),也不會(huì)拋出異常,而是將某些任務(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上,無論你開幾個(gè)模擬的多線程該任務(wù)都不可能得到加速,因?yàn)镃PU總的運(yùn)算能力就那些。
因?yàn)镃PU密集型任務(wù)使得CPU使用率很高,若開過多的線程數(shù),會(huì)造成CPU過度切換,所以CPU密集型任務(wù)配置盡可能少的線程數(shù)量:
一般公式:CPU核數(shù)+1個(gè)線程的線程池

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個(gè)線程數(shù)

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

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

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

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


當(dāng)前名稱:線程的相關(guān)知識(shí)點(diǎn)總結(jié)
分享路徑:http://weahome.cn/article/gsgecg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部