《1》執行緒的狀態:new(建立)、runnable(可執行)、blocked(阻塞)、waiting(等待)、timed_waiting、terminated(執行完畢)
《2》常見的四種執行緒池:
《3》引數原理講解:
(1)corepoolsize 核心執行緒數,指保留的執行緒池大小(不超過maximumpoolsize值時,執行緒池中最多有corepoolsize 個執行緒工作)。
(2)maximumpoolsize 指的是執行緒池的最大大小(執行緒池中最大有corepoolsize 個執行緒可執行)。
(3)keepalivetime 指的是空閒執行緒結束的超時時間(當乙個執行緒不工作時,過keepalivetime 長時間將停止該執行緒)。
(4)unit 是乙個列舉,表示 keepalivetime 的單位(有nanoseconds, microseconds, milliseconds, seconds, minutes, hours, days,7個可選值)。
(5)workqueue 表示存放任務的佇列(存放需要被執行緒池執行的執行緒佇列)。
(6)handler 拒絕策略(新增任務失敗後如何處理該任務).
《4》拒絕策略:
(1)abortpolicy:丟掉這個任務並丟擲rejectedexecutionexception異常
(2)discardpolicy:直接丟掉任務,沒有任何反應
(3)discardoldestpolicy:丟掉老的任務,沒有任何反應
(4)callerrunsolicy:主線程自己去執行這個任務
(5)自定義:實現rejectedexecutionhandler介面
《5》使用示例:
《6》執行策略
(1)剛建立執行緒池時,裡面沒有執行緒;任務佇列是作為引數傳過來,即時佇列裡面
有任務,也不會馬上執行;
(2)當呼叫excute()方法新增乙個任務時,執行緒池會做如下判斷:
a、如果正在執行的執行緒數小於corepoolsize,那麼馬上建立執行緒執行這個任務;
b、如果大於或等於corepoolsize,那麼將這個任務加入佇列;
c、如果對列也滿了,執行執行緒數小於maximumpoolsize,建立執行緒執行這個任務;
d、對列滿了,大於或等於maximumpoolsize,那麼會拒絕這個任務;
(3)當乙個執行緒執行完了,會從佇列中去下乙個任務來執行;
(4)當乙個執行緒無事做,超過keepalivetime是,執行緒會判斷,如果當前執行數大於
corepoolsize,那麼這個任務被停掉,所以執行緒的所有任務完成後,它最終收縮到
corepoolsize的大小;
例子:這個過程說明,並不是先加入任務就一定會先執行。假設佇列大小為 4,corepoolsize為2,
maximumpoolsize為6,那麼當加入15個任務時,執行的順序類似這樣:首先執行任務 1、2,
然後任務3~6被放入佇列。這時候佇列滿了,任務7、8、9、10 會被馬上執行,而任務 11~15
則會丟擲異常。最終順序是:1、2、7、8、9、10、3、4、5、6。當然這個過程是針對指定大
小的arrayblockingqueue來說,如果是linkedblockingqueue,因為該佇列
無大小限制,所以不存在上述問題
java四種常用執行緒池的使用
public class threadpooltest catch interruptedexception e cachedthreadpool.execute new runnable log.info ato system.out.println ato 在主線程關閉之前一共執行了幾次子執行緒...
java 四種執行緒池的簡介
前瞻 四種執行緒池內部構造都是來自同乙個方法 下面分別介紹一下各個引數的含義 corepoolsize 執行緒池中所儲存的核心執行緒數。執行緒池初始化啟動之後,預設是空的,只有當任務來臨之時,才會建立執行緒 處理請求。當然可以使用prestartcorethread 方法可以使執行緒池初始化之後,立...
四種執行緒池
其他執行緒池 核心執行緒 執行緒池大小 佇列策略 newcachedthreadpool integer.max value synchronousqueue newfixedthreadpool 建立時可以設定引數 建立時可以設定引數 linkedblockingqueue newschedule...