欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java線程池實現(xiàn)原理總結(jié)

 更新時間:2022年01月27日 09:07:17   作者:負債程序猿  
這篇文章主要給大家分享的是Java線程池實現(xiàn)原理總結(jié),線程池參數(shù)、線程池執(zhí)行流程等內(nèi)容上總結(jié),具有一定參考戒指,需要的小伙伴可以參考一下,希望對你有所幫助

要理解實現(xiàn)原理,必須把線程池的幾個參數(shù)徹底搞懂,不要死記硬背

一、線程池參數(shù)

  • 1、corePoolSize(必填):核心線程數(shù)。
  • 2、maximumPoolSize(必填):最大線程數(shù)。
  • 3、keepAliveTime(必填):線程空閑時長。如果超過該時長,非核心線程就會被回收。
  • 4、unit(必填):指定keepAliveTime的時間單位。常用的有:TimeUnit.MILLISECONDS(毫秒)、TimeUnit.SECONDS(秒)、TimeUnit.MINUTES(分)。
  • 5、workQueue(必填):任務(wù)隊列。通過線程池的execute()方法提交的Runnable對象將存儲在該隊列中。
  • 6、threadFactory(可選):線程工廠。一般就用默認的。
  • 7、handler(可選):拒絕策略。當(dāng)線程數(shù)達到最大線程數(shù)時就要執(zhí)行飽和策略。

說下核心線程數(shù)和最大線程數(shù)的區(qū)別

拒絕策略可選值:

1、AbortPolicy(默認):放棄任務(wù)并拋出RejectedExecutionException異常。
2、CallerRunsPolicy:由調(diào)用線程處理該任務(wù)。
3、DiscardPolicy:放棄任務(wù),但是不拋出異常??梢耘浜线@種模式進行自定義的處理方式。
4、DiscardOldestPolicy:放棄隊列最早的未處理任務(wù),然后重新嘗試執(zhí)行任務(wù)。

二、線程池執(zhí)行流程

上個流程圖,先試著自己看下能不能看懂

簡短的總結(jié)下線程池執(zhí)行流程:

  • 1、一個任務(wù)提交到線程池后,如果當(dāng)前的線程數(shù)沒達到核心線程數(shù),則新建一個線程并且執(zhí)行新任務(wù),注意一點,這個新任務(wù)執(zhí)行完后,該線程不會被銷毀;
  • 2、如果達到了,則判斷任務(wù)隊列滿了沒,如果沒滿,則將任務(wù)放入任務(wù)隊列;
  • 3、如果滿了,則判斷當(dāng)前線程數(shù)量是否達到最大線程數(shù),如果沒達到,則創(chuàng)建新線程來執(zhí)行任務(wù),注意,如果線程池中線程數(shù)量大于核心線程數(shù),每當(dāng)有線程超過了空閑時間,就會被銷毀,直到線程數(shù)量不大于核心線程數(shù);
  • 4、如果達到了最大線程數(shù),并且任務(wù)隊列滿了,就會執(zhí)行飽和策略;

三、四種現(xiàn)成的線程池

不想自己new線程池的話,可以用現(xiàn)成的

1、定長線程池(FixedThreadPool)

特點:只有核心線程,線程數(shù)量固定,執(zhí)行完立即回收,任務(wù)隊列為鏈表結(jié)構(gòu)的有界隊列。
應(yīng)用場景:控制線程最大并發(fā)數(shù)

2、定時線程池(ScheduledThreadPool )

特點:核心線程數(shù)量固定,非核心線程數(shù)量無限,執(zhí)行完閑置10ms后回收,任務(wù)隊列為延時阻塞隊列。
應(yīng)用場景:執(zhí)行定時或周期性的任務(wù)。

3、可緩存線程池(CachedThreadPool)

特點:無核心線程,非核心線程數(shù)量無限,執(zhí)行完閑置60s后回收,任務(wù)隊列為不存儲元素的阻塞隊列。
應(yīng)用場景:執(zhí)行大量、耗時少的任務(wù)。

4、單線程化線程池(SingleThreadExecutor)

特點:只有1個核心線程,無非核心線程,執(zhí)行完立即回收,任務(wù)隊列為鏈表結(jié)構(gòu)的有界隊列。
應(yīng)用場景:不適合并發(fā)但可能引起IO阻塞性及影響UI線程響應(yīng)的操作,如數(shù)據(jù)庫操作、文件操作等。

上述四個線程池雖然方便,但是阿里巴巴規(guī)范明確說明不建議使用,因為可能會造成內(nèi)存溢出,具體原因如下:

FixedThreadPoolSingleThreadExecutor:主要問題是堆積的請求處理隊列均采用LinkedBlockingQueue,可能會耗費非常大的內(nèi)存,嚴(yán)重的直接導(dǎo)致內(nèi)存溢出。
CachedThreadPoolScheduledThreadPool:主要問題是它們的最大線程數(shù)是Integer.MAX_VALUE,可能會創(chuàng)建數(shù)量非常多的線程,嚴(yán)重的直接導(dǎo)致內(nèi)存溢出。

到此這篇關(guān)于Java線程池實現(xiàn)原理總結(jié)的文章就介紹到這了,更多相關(guān)線程池實現(xiàn)原理總結(jié)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論