2、當調用 execute() 方法添加壹個任務時,線程池會做如下判斷:
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<Runnable>來說,如果是LinkedBlockingQueue<Runnable>,因為該隊列無大小限制,所以不存在上述問題。