# 線程池 #
-- JAVA線程池原理詳解(1)
-- JAVA線程池原理詳解(2)
-- Java線程池總結
**線程池概述:**
*
在一個應用程序中,我們需要多次使用線程,這就需要多次創建並銷毀線程。而創建並銷毀線程的過程會消耗內存。內存資源在java中很重要,所以就有了線程池用來管理線程,同時也減少了內存的消耗。Java中已經提供了創建線程池的一個類:Executor。平常我們創建 線程池時,一般使用它的子類:ThreadPoolExecutor。
*
public ThreadPoolExecutor(
int corePoolSize, // 線程池中的核心線程數量。這幾個核心線程,在沒有用的時候,也不會被回收
int maximumPoolSize,//線程池中可以容納的最大線程的數量
long keepAliveTime, //線程池中除了核心線程之外的其他線程最長可以保留的時間。因 為在線程池中,核心線程在無任務的情況下也不能被清除,非核心線程是有存活時間的,就是非核心線程可以保留的最長的空閑時間
TimeUnit unit,// 計算除了核心線程之外的其他線程最長可以保留的時間的一個單位
BlockingQueue<Runnable> workQueue, //等待隊列,任務可以儲存在任務隊列中等待被執行,執行的是FIFIO原則(先進先出)
ThreadFactory threadFactory, //創建線程的線程工廠
RejectedExecutionHandler handler一種拒絕策略,我們可以在任務滿了之后,拒絕執行某些任務
......
)
**線程池實現原理:**
*
提交一個任務到線程池中,線程池的處理流程:
1、判斷線程池里的核心線程是否都在執行任務,如果不是(核心線程空閑或者還有核心線程沒有被創建)則創建一個新的工作線程來執行任務。
2、如果核心線程都在執行任務,線程池判斷工作隊列是否已滿,如果工作隊列沒有滿,則將新提交的任務存儲在這個工作隊列里。
3、如果工作隊列滿了,就會判斷線程池里的線程是否都處於工作狀態,如果沒有,則創建一個新的工作線程來執行任務。如果已經滿了,則交給拒絕策略來處理這個任務。
**handler的拒絕策略有四種:**
*
AbortPolicy:不執行新任務,直接拋出異常,提示線程池已滿
DisCardPolicy:不執行新任務,也不拋出異常
DisCardOldSetPolicy:將消息隊列中的第一個任務替換為當前新進來的任務執行
CallerRunsPolicy:直接調用execute來執行當前任務
**四種常見的線程池種類**
①newSingleThreadExecutor:單個線程的線程池,即線程池中每次只有一個線程工作,單線程串行執行任務
②newFixedThreadExecutor(n):固定數量的線程池,沒提交一個任務就是一個線程,直到達到線程池的最大數量,然后后面進入等待隊列直到前面的任務完成才繼續執行
③newCacheThreadExecutor(推薦使用):可緩存線程池,當線程池大小超過了處理任務所需的線程,那么就會回收部分空閑(一般是60秒無執行)的線程,當有任務來時,又智能的添加新線程來執行。
④newScheduleThreadExecutor:大小無限制的線程池,支持定時和周期性的執行線程