創(chuàng)建線程池的兩種方式
1.使用Executors
Executors.newSingleThreadExecutor();單個線程池(池中只有一個線程)
Executors.newFixedThreadPool(5);固定線程池
Executors.newCachedThreadPool();可緩存的線程池
Executors.newScheduledThreadPool(5);計劃任務(wù)線程池
CachedThreadPool:可緩存的線程池,該線程池中沒有核心線程,非核心線程的數(shù)量為Integer.max_value,就是無限大,當(dāng)有需要時創(chuàng)建線程來執(zhí)行任務(wù),沒有需要時回收線程,適用于耗時少,任務(wù)量大的情況。
SecudleThreadPool:周期性執(zhí)行任務(wù)的線程池,按照某種特定的計劃執(zhí)行線程中的任務(wù),有核心線程,但也有非核心線程,非核心線程的大小也為無限大。適用于執(zhí)行周期性的任務(wù)。
SingleThreadPool:只有一條線程來執(zhí)行任務(wù),適用于有順序的任務(wù)的應(yīng)用場景。
FixedThreadPool:定長的線程池,有核心線程,核心線程的即為最大的線程數(shù)量,沒有非核心線程
2.自定義線程池
public ThreadPoolExecutor(int corePoolSize, //核心線程數(shù)
int maximumPoolSize, //最大線程數(shù)
long keepAliveTime, //線程空閑狀態(tài)下,存活id時間
TimeUnit unit, //時間單位
BlockingQueue<Runnable> workQueue, //任務(wù)隊列
ThreadFactory threadFactory, //創(chuàng)建線程的工程類
RejectedExecutionHandler handler //拒絕任務(wù)添加的策略
)
下面解釋下一下構(gòu)造器中各個參數(shù)的含義:
corePoolSize:核心池的大小,這個參數(shù)跟后面講述的線程池的實現(xiàn)原理有非常大的關(guān)系。在創(chuàng)建了線程池后,默認(rèn)情況下,線程池中并沒有任何線程,而是等待有任務(wù)到來才創(chuàng)建線程去執(zhí)行任務(wù),除非調(diào)用了prestartAllCoreThreads()或者prestartCoreThread()方法,從這2個方法的名字就可以看出,是預(yù)創(chuàng)建線程的意思,即在沒有任務(wù)到來之前就創(chuàng)建corePoolSize個線程或者一個線程。默認(rèn)情況下,在創(chuàng)建了線程池后,線程池中的線程數(shù)為0,當(dāng)有任務(wù)來之后,就會創(chuàng)建一個線程去執(zhí)行任務(wù),當(dāng)線程池中的線程數(shù)目達(dá)到corePoolSize后,就會把到達(dá)的任務(wù)放到緩存隊列當(dāng)中;
maximumPoolSize:線程池最大線程數(shù),這個參數(shù)也是一個非常重要的參數(shù),它表示在線程池中最多能創(chuàng)建多少個線程;
keepAliveTime:表示線程沒有任務(wù)執(zhí)行時最多保持多久時間會終止。默認(rèn)情況下,只有當(dāng)線程池中的線程數(shù)大于corePoolSize時,keepAliveTime才會起作用,直到線程池中的線程數(shù)不大于corePoolSize,即當(dāng)線程池中的線程數(shù)大于corePoolSize時,如果一個線程空閑的時間達(dá)到keepAliveTime,則會終止,直到線程池中的線程數(shù)不超過corePoolSize。但是如果調(diào)用了allowCoreThreadTimeOut(boolean)方法,在線程池中的線程數(shù)不大于corePoolSize時,keepAliveTime參數(shù)也會起作用,直到線程池中的線程數(shù)為0;
unit:參數(shù)keepAliveTime的時間單位
workQueue:一個阻塞隊列,用來存儲等待執(zhí)行的任務(wù),這個參數(shù)的選擇也很重要,會對線程池的運(yùn)行過程產(chǎn)生重大影響,一般來說,這里的阻塞隊列有以下幾種選擇:
ArrayBlockingQueue;
LinkedBlockingQueue;(這是一個無界隊列,如果沒有定義大小的話,maximumPoolSize就無效了)
SynchronousQueue;
threadFactory:線程工廠,主要用來創(chuàng)建線程;
handler:表示當(dāng)拒絕處理任務(wù)時的策略,默認(rèn)有以下四種取值:
ThreadPoolExecutor.AbortPolicy:丟棄任務(wù)并拋出RejectedExecutionException異常。
ThreadPoolExecutor.DiscardPolicy:也是丟棄任務(wù),但是不拋出異常。
ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊列最前面的任務(wù),然后重新嘗試執(zhí)行任務(wù)(重復(fù)此過程)
ThreadPoolExecutor.CallerRunsPolicy:由調(diào)用線程處理該任務(wù)
線程池執(zhí)行的流程:(流程很重要)

當(dāng)任務(wù)提交給ThreadPoolExecutor 線程池中,先檢查核心線程數(shù)是否已經(jīng)全部使用,如果沒有交由核心線程去執(zhí)行任務(wù),如果核心線程數(shù)已經(jīng)全部占用,則將任務(wù)添加到隊列里面,如果隊列已經(jīng)占滿,比較當(dāng)前線程池的中線程的數(shù)量是不是與超過maximumPoolSize,如果沒有查過則創(chuàng)建線程去執(zhí)行,也就是說線程池最多可以接受多少任務(wù)呢?就是maximumPoolSize+隊列的大小。當(dāng)線程池中的線程的數(shù)量大于corePoolSize數(shù)量有空閑線程則執(zhí)行回收,回收時間是keepAliveTime,單位是unit,都是初始化的時候設(shè)置的。
1.啟動策略

2.流程圖(摘抄)
