1.阻塞隊(duì)列
1)支持阻塞的插入方法:意思是當(dāng)隊(duì)列滿時(shí)恬试,隊(duì)列會(huì)阻塞插入元素的線程劝枣,直到隊(duì)列不滿硝岗。
2)支持阻塞的移除方法:意思是在隊(duì)列為空時(shí)朴摊,獲取元素的線程會(huì)等待隊(duì)列變?yōu)榉强铡?br>
在并發(fā)編程中使用生產(chǎn)者和消費(fèi)者模式能夠解決絕大多數(shù)并發(fā)問題。該模式通過平衡生產(chǎn)線程和消費(fèi)線程的工作能力來提高程序整體處理數(shù)據(jù)的速度千扔。
-
BlockingQueue常用方法
常用阻塞隊(duì)列
ArrayBlockingQueue:一個(gè)由數(shù)組結(jié)構(gòu)組成的有界阻塞隊(duì)列憎妙。
LinkedBlockingQueue:一個(gè)由鏈表結(jié)構(gòu)組成的有界阻塞隊(duì)列。
PriorityBlockingQueue:一個(gè)支持優(yōu)先級(jí)排序的無界阻塞隊(duì)列曲楚。
DelayQueue:一個(gè)使用優(yōu)先級(jí)隊(duì)列實(shí)現(xiàn)的無界阻塞隊(duì)列厘唾。
SynchronousQueue:一個(gè)不存儲(chǔ)元素的阻塞隊(duì)列。
LinkedTransferQueue:一個(gè)由鏈表結(jié)構(gòu)組成的無界阻塞隊(duì)列龙誊。
LinkedBlockingDeque:一個(gè)由鏈表結(jié)構(gòu)組成的雙向阻塞隊(duì)列抚垃。有界無界?
有界隊(duì)列就是長度有限趟大,滿了以后生產(chǎn)者會(huì)阻塞鹤树,無界隊(duì)列就是里面能放無數(shù)的東西而不會(huì)因?yàn)殛?duì)列長度限制被阻塞。
2.線程池
-
為什么要用線程池护昧?
第一:降低資源消耗魂迄。
第二:提高響應(yīng)速度。
第三:提高線程的可管理性惋耙。
線程池的創(chuàng)建各個(gè)參數(shù)含義
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,
long keepAliveTime,TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
1.corePoolSize : 線程池中的核心線程數(shù)
2.maximumPoolSize : 線程池中允許的最大線程數(shù)
3.keepAliveTime : 線程空閑時(shí)的存活時(shí)間
4.TimeUnit : keepAliveTime的時(shí)間單位
5.workQueue : workQueue必須是BlockingQueue阻塞隊(duì)列捣炬。當(dāng)線程池中的線程數(shù)超過它的corePoolSize的時(shí)候熊昌,線程會(huì)進(jìn)入阻塞隊(duì)列進(jìn)行阻塞等待
6.threadFactory : 創(chuàng)建線程的工廠,通過自定義的線程工廠可以給每個(gè)新建的線程設(shè)置一個(gè)具有識(shí)別度的線程名湿酸,當(dāng)然還可以更加自由的對(duì)線程做更多的設(shè)置
7.RejectedExecutionHandler : 線程池的飽和策略婿屹,當(dāng)阻塞隊(duì)列滿了,且沒有空閑的工作線程推溃,如果繼續(xù)提交任務(wù)昂利,必須采取一種策略處理該任務(wù)
線程池的工作機(jī)制
1)如果當(dāng)前運(yùn)行的線程少于corePoolSize,則創(chuàng)建新線程來執(zhí)行任務(wù)(注意铁坎,執(zhí)行這一步驟需要獲取全局鎖)蜂奸。
2)如果運(yùn)行的線程等于或多于corePoolSize,則將任務(wù)加入BlockingQueue硬萍。
3)如果無法將任務(wù)加入BlockingQueue(隊(duì)列已滿)扩所,則創(chuàng)建新的線程來處理任務(wù)。
4)如果創(chuàng)建新線程將使當(dāng)前運(yùn)行的線程超出maximumPoolSize朴乖,任務(wù)將被拒絕祖屏,并調(diào)用RejectedExecutionHandler.rejectedExecution()方法。合理地配置線程池
CPU密集型任務(wù): Runtime.getRuntime().availableProcessors()配置最大線程數(shù)
IO密集型任務(wù) : 線程數(shù) :機(jī)器CPU核心數(shù)*2
混合型任務(wù) : 線程池拆分