1 當一個任務通過submit或者execute方法提交到線程池的時候,如果當前池中線程數(包括閑置線程)小於coolPoolSize,則創建一個線程執行該任務。
2 如果當前線程池中線程數已經達到coolPoolSize,則將任務放入等待隊列。
3 如果任務不能入隊,說明等待隊列已滿,若當前池中線程數小於maximumPoolSize,則創建一個臨時線程(非核心線程)執行該任務。
4 如果當前池中線程數已經等於maximumPoolSize,此時無法執行該任務,根據拒絕執行策略處理。
注意:當池中線程數大於coolPoolSize,超過keepAliveTime時間的閑置線程會被回收掉。回收的是非核心線程,核心線程一般是不會回收的。如果設置allowCoreThreadTimeOut(true),則核心線程在閑置keepAliveTime時間后也會被回收。
任務隊列是一個阻塞隊列,線程執行完任務后會去隊列取任務來執行,如果隊列為空,線程就會阻塞,直到取到任務。
我們假定有這個場景:
corePoolSize:1
mamximumPoolSize:3
keepAliveTime:60s
workQueue:ArrayBlockingQueue,有界阻塞隊列,隊列大小是4
handler:默認的策略,拋出來一個ThreadPoolRejectException
以下是新任務來時的場景:以poolSize=0 表示線程數量
1.來了一個任務,poolSize<corePoolSize 新建一個線程
2.又來了一個任務,poolSize>=corePoolSize ,隊列未滿,將任務丟入隊列等待執行
3.繼續添加任務,如果隊列滿了,而 poolSize < maximum,此時將會新建線程
4.如果繼續添加任務,隊列滿,線程數量達到maximum,則會讓handler 去處理。默認拋出異常
5.如果現在線程數量是3,但是都處於空閑狀態,空閑超過60s 之后,其中2個線程就會被回收,保留一個(coolPoolSize=1)
所以當任務來臨時的處理順序是這樣的:
首先創建 corePoolSize 線程
然后丟到隊列等待
隊列滿,新建maximum線程
繼續滿,handler 處理