當前位置:編程學習大全網 - 源碼下載 - threadpoolexecutor 的linkedblockingqueue 隊列 需要關閉嗎

threadpoolexecutor 的linkedblockingqueue 隊列 需要關閉嗎

1、線程池剛創建時,裏面沒有壹個線程。任務隊列是作為參數傳進來的。不過,就算隊列裏面有任務,線程池也不會馬上執行它們。

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>,因為該隊列無大小限制,所以不存在上述問題。

  • 上一篇:Libra源代碼
  • 下一篇:退火算法排課源代碼
  • copyright 2024編程學習大全網