1、線程池的實現(xiàn)原理
- 線程池判斷核心線程池里的線程是否都在執(zhí)行任務,如果不是,則創(chuàng)建新的工作線程來執(zhí)行,如果都在執(zhí)行則進入下個流程。
- 線程池判斷工作隊列是否已滿。如果沒滿,任務存儲在工作隊列;如果滿了,進入下個流程。
- 線程池判斷所有線程是否都處于工作狀態(tài),如果沒有則新建線程來執(zhí)行任務,如果滿了則交給飽和策略處理。

線程池處理

線程池執(zhí)行
- 當前運行線程少于corePoolSize,則創(chuàng)建新線程來執(zhí)行,需要獲取全局鎖。
- 如果運行線程等于或多于corePoolSize,則加入BlockingQueue。
- 如果BlockingQueue滿了,則創(chuàng)建新的線程來處理任務,需要獲取全局鎖。
- 如果創(chuàng)建新線程會超過最大PoolSize,將被拒絕。
- 設計中盡可能避免獲取全局鎖。
- 線程池創(chuàng)建線程時,會將線程封裝成工作線程Worker,Worker在執(zhí)行完任務后,還會循環(huán)獲取工作隊列里的任務來執(zhí)行。

Worker
2、線程池的使用。
new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, milliseconds, runnableTaskQueue, runnableTaskQueue, handler)
- 這個runnableTaskQueue是用于保存等待執(zhí)行任務的隊列。
- execute()用于提交不需要返回值的任務。
threadsPool.execute(new Runnable() {});
- submit()方法用于提交需要返回值的任務。
Future<Object> future = executor.submit();
- shutdonwNow首先將線程池的狀態(tài)設置成STOP,然后嘗試停止所有正在執(zhí)行或暫停任務的線程,并返回等待執(zhí)行任務的列表。shutdown將線程池的狀態(tài)設置成SHUTDOWN狀態(tài),然后中斷所有沒有正在執(zhí)行任務的線程。如果任務不一定要執(zhí)行完才使用shutdownNow。
- CPU密集型任務應配置盡可能小線程Ncpu +1個線程。IO密集由于任務線程并不是一直執(zhí)行任務,應配置盡可能多的線程?;旌闲腿蝿杖绻梢圆鸱謩t進行拆分。
3、Executor框架
在上層,Java多線程程序通常將應用分解為若干個任務,然后使用用戶級的調(diào)度器將這些任務映射為固定數(shù)量的線程。在底層,操作系統(tǒng)內(nèi)核將這些線程映射到硬件處理器上。
HotSpot VM線程模型中,Java線程被一對一映射為本地操作系統(tǒng)線程。

量級調(diào)度模型
- 任務,包括被執(zhí)行任務需要實現(xiàn)的接口:Runnable、Callable。
- 任務的執(zhí)行,執(zhí)行機制的核心接口Executor,以及繼承自Executor的ExecutorService接口。
- 異步計算的結(jié)果。

Executor
- Executor將任務的提交與任務的執(zhí)行分離。

Executor執(zhí)行
FixedThreadPool
- 當線程池中的線程數(shù)大于corePoolSize時,keepAliveTime為多于空閑線程等待新任務的最長時間,超過后多于的線程池將被終止。

FixedThreadPool
SingleThreadExecutor
- corePoolSize和maximumPoolSize被設置為1。
- 使用單個worker線程的Executor。

SingleThreadTExecutor
CachedThreadPool
- 根據(jù)需要創(chuàng)建新線程的線程池,corePoolSize被設置為0,maximumPoolSize被設置為Interger.MAX_VALUE,即無界。
- 使用SynchronousQueue作為線程池的工作隊列。如果主線程提交任務的速度高于maximumPool中線程處理任務的速度時,CachedThreadPool會不斷創(chuàng)建新線程。

CachedThreadPool
ScheduledThreadPoolExecutor
- 使用DelayQueue當任務隊列。

ScheduledThreadPoolExecutor
FutureTask
- 基于AbstractQueueSynchronizer實現(xiàn)。
- 每一個基于AQS實現(xiàn)的同步器都會包含兩種基本操作,至少一個acquire和至少一個release。

FutureTask