線程的實現(xiàn)
- Thread
- Runnable
- Callable
什么時候使用線程池闪金?
- 單任務(wù)處理時間比較短
- 需要處理的任務(wù)量大
線程池的優(yōu)勢
- 重用存在的線程,減少線程創(chuàng)建瞳腌、銷毀的開銷绞铃,提高性能
- 提高響應速度,任務(wù)可以使用線程池中空閑的線程嫂侍,多任務(wù)同時執(zhí)行
- 提高線程的可管理性儿捧,對線程進行統(tǒng)一分配荚坞,監(jiān)控和調(diào)優(yōu)
線程池的狀態(tài)
- RUNNING 能夠接收任務(wù),對已添加的任務(wù)進行處理
- SHUTDOWN 不接收任務(wù)菲盾,但還能處理已添加的任務(wù)
- STOP 不接收任務(wù)颓影,不處理已添加的任務(wù),而且中斷正在執(zhí)行的任務(wù)
- TIDYING 當所有任務(wù)都終止懒鉴,如果想在 TIDYING 狀態(tài)時執(zhí)行某些東西诡挂,可以重寫 terminated() 函數(shù)
- TERMINATED 線程池終止
線程池的具體實現(xiàn)
- ThreaPoolExecutor 默認線程池
- ScheduledThreadPoolExecutor 定時線程池
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
參數(shù)解析
corePoolSize
線程池中的核心線程數(shù),當提交一個任務(wù)時临谱,線程池創(chuàng)建一個新線程執(zhí)行任務(wù)璃俗,直到當前線程數(shù)等于 corePoolSize;如果當前線程數(shù)為 corePoolSize悉默,繼續(xù)提交的任務(wù)被保存到阻塞隊列中城豁,等待被執(zhí)行;如果執(zhí)行了線程池的 prestartAllCoreThreads() 方法抄课,線程池會提前創(chuàng)建并啟動所有核心線程唱星。maximumPoolSize
線程池中允許的最大線程數(shù)。如果當前阻塞隊列滿了跟磨,且繼續(xù)提交任務(wù)间聊,則創(chuàng)建新的線程執(zhí)行任務(wù),前提是當前線程數(shù)小于maximumPoolSizekeepAliveTime
線程池維護線程所允許的空閑時間吱晒。當線程池中的線程數(shù)量大于 corePoolSize 的時候甸饱,如果這時沒有新的任務(wù)提交,核心線程外的線程不會立即銷毀仑濒,而是會等待,直到等待的時間超過了keepAliveTime偷遗;unit
keepAliveTime的單位-
workQueue
用來保存等待被執(zhí)行的任務(wù)的阻塞隊列墩瞳,且任務(wù)必須實現(xiàn)Runable接口,在JDK中提供了如下阻塞隊列:
(a)氏豌、ArrayBlockingQueue:基于數(shù)組結(jié)構(gòu)的有界阻塞隊列喉酌,按FIFO排序任務(wù);(b)泵喘、LinkedBlockingQuene:基于鏈表結(jié)構(gòu)的阻塞隊列泪电,按FIFO排序任務(wù),吞吐量通常要高于ArrayBlockingQuene纪铺;
(c)相速、SynchronousQuene:一個不存儲元素的阻塞隊列,每個插入操作必須等到另一個線程調(diào)用移除操作鲜锚,否則插入操作一直處于阻塞狀態(tài)突诬,吞吐量通常要高于LinkedBlockingQuene苫拍;
(d)、priorityBlockingQuene:具有優(yōu)先級的無界阻塞隊列旺隙;
threadFactory
它是ThreadFactory類型的變量绒极,用來創(chuàng)建新線程。默認使用Executors.defaultThreadFactory() 來創(chuàng)建線程蔬捷。使用默認的 ThreadFactory 來創(chuàng)建線程時垄提,會使新創(chuàng)建的線程具有相同的 NORM_PRIORITY 優(yōu)先級并且是非守護線程,同時也設(shè)置了線程的名稱周拐。-
handler
線程池的飽和策略塔淤,當阻塞隊列滿了,且沒有空閑的工作線程速妖,如果繼續(xù)提交任務(wù)高蜂,必須采取一種策略處理該任務(wù),線程池提供了4種策略:
(a)罕容、AbortPolicy:直接拋出異常备恤,默認策略;(b)锦秒、CallerRunsPolicy:用調(diào)用者所在的線程來執(zhí)行任務(wù)露泊;
(c)、DiscardOldestPolicy:丟棄阻塞隊列中靠最前的任務(wù)旅择,并執(zhí)行當前任務(wù)惭笑;
(d)、DiscardPolicy:直接丟棄任務(wù)生真;
上面的4種策略都是 ThreadPoolExecutor 的內(nèi)部類沉噩。
當然也可以根據(jù)應用場景實現(xiàn) RejectedExecutionHandler 接口,自定義飽和策略柱蟀,如記錄日志或持久化存儲不能處理的任務(wù)川蒙。
線程池監(jiān)控
public long getTaskCount() //線程池已執(zhí)行與未執(zhí)行的任務(wù)總數(shù)
public long getCompletedTaskCount() //已完成的任務(wù)數(shù)
public int getPoolSize() //線程池當前的線程數(shù)
public int getActiveCount() //線程池中正在執(zhí)行任務(wù)的線程數(shù)量