從 Java 5 開始,Java 提供了本身的線程池。線程池就是一個線程的容器,每次只執行額定數量的線程。 java.util.concurrent.ThreadPoolExecutor 就是這樣的線程池。它很靈活,但使用起來也比較複雜,本文就對其作一個介紹。 java
首先是構造函數。以最簡單的構造函數爲例: 函數
public ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue)
public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue) 線程
看起來挺複雜的。這裏介紹一下。 隊列
corePoolSize 指的是保留的線程池大小。
maximumPoolSize 指的是線程池的最大大小。
keepAliveTime 指的是空閒線程結束的超時時間。
unit 是一個枚舉,表示 keepAliveTime 的單位。
workQueue 表示存聽任務的隊列。 it
咱們能夠從線程池的工做過程當中瞭解這些參數的意義。線程池的工做過程以下: 容器
一、線程池剛建立時,裏面沒有一個線程。任務隊列是做爲參數傳進來的。不過,就算隊列裏面有任務,線程池也不會立刻執行它們。 線程池
二、當調用 execute() 方法添加一個任務時,線程池會作以下判斷: 構造函數
a. 若是正在運行的線程數量小於 corePoolSize,那麼立刻建立線程運行這個任務; 方法
b. 若是正在運行的線程數量大於或等於 corePoolSize,那麼將這個任務放入隊列。 im
c. 若是這時候隊列滿了,並且正在運行的線程數量小於 maximumPoolSize,那麼仍是要建立線程運行這個任務;
d. 若是隊列滿了,並且正在運行的線程數量大於或等於 maximumPoolSize,那麼線程池會拋出異常,告訴調用者「我不能再接受任務了」。
三、當一個線程完成任務時,它會從隊列中取下一個任務來執行。
四、當一個線程無事可作,超過必定的時間(keepAliveTime)時,線程池會判斷,若是當前運行的線程數大於 corePoolSize,那麼這個線程就被停掉。因此線程池的全部任務完成後,它最終會收縮到 corePoolSize 的大小。