線程的實現(xiàn)
- Thread
- Runnable
- Callable
什么時候使用線程池?
- 單任務(wù)處理時間比較短
- 需要處理的任務(wù)量大
線程池的優(yōu)勢
- 重用存在的線程,減少線程創(chuàng)建、銷毀的開銷,提高性能
- 提高響應(yī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ù)應(yīng)用場景實現(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ù)量