上一期簡單的聊了一下執行緒池的建立。這一期我們就,稍微熟悉一下執行緒池執行任務的過程吧!
執行緒池的工作原理是怎麼樣的呢?
首先,我用圖來說明吧!
這裡可以看到有乙個任務佇列,然後還有乙個工作的執行緒池。今天主要將的就是向任務佇列中新增任務的過程!
對於執行緒池我們上一期是做了乙個稍微的解釋的。我們構建執行緒池的時候,無論我們傳入佇列或者是不傳入最後都會有乙個佇列的。那麼這個佇列是用來幹什麼的呢?當我們提交的任務不能被及時執行的時候,可以入佇列,等待被執行的。現在對於執行緒池的提交任務流程做乙個簡單的**。
這裡我們主要以cachedthreadpool為例。
圖中所有建立的執行緒都會被放到執行緒池的hashset中記錄下來!
這個流程圖大概分為以下幾個部分:
提交任務首先判斷是否是null,如果是null就丟擲空指標異常,如果不是執行2。
判斷執行緒池中工作的執行緒數是否小於核心執行緒池的大小。如果小於執行 3,如果大於執行4
建立乙個執行緒來執行提交的任務,如果失敗重新獲取執行緒池狀態,然後執行4,成功就返回
判斷執行緒池的狀態是否在執行和嘗試向把任務加入等待佇列,如果執行緒池已經關閉或者放入等待佇列失敗,執行6。如果放入佇列成功執行5
因為成功的入隊了,我們需要重新判斷執行緒池的狀態,因為在放入佇列的過程中線程池的狀態可能會發生變化。如果發現執行緒池的狀態不是在執行就將剛才新增的任務從佇列中移除,然後執行拒絕策略。如果是在執行狀態執行7
嘗試建立乙個執行緒來執行任務,如果建立執行緒失敗就執行拒絕策略
判斷當前的工作執行緒數是不是0如果不是就返回,如果是就建立乙個執行緒!
public
void
execute(runnable command)
//獲取狀態以後,如果執行緒池還是在執行態,嘗試將新的任務放入到佇列當中去。
if (isrunning(c) && workqueue.offer(command))
//建立執行緒失敗了,就拒絕任務就好了!
else
if (!addworker(command, false))
reject(command);
}
大家可能發現了,執行任務的時候有乙個submit還有乙個execute這兩個方法的區別就是:submit會返回乙個非同步的結果。但是execute方法沒有返回值。這個很清楚吧!
個人認為單就提交任務的 流程算是比較清楚了!本期沒有**,因為分析的都是原始碼!想看**的小夥伴們可以直接看jdk1.7的源**!歡迎交流!
現在很多電影都有彩蛋,這個執行緒池系列也來了個彩蛋吧!下一期將會說一下建立新執行緒新增到hashset和執行緒池的關閉過程!敬請期待!!!
java執行緒池(2) 常見執行緒池
執行緒池的建立和使用 生成執行緒池採用了工具類executors的靜態方法,一下是幾種常見的執行緒池。singlethreadexecutor 單個後台執行緒 其緩衝佇列是無界的 public static executorservice newsinglethreadexecutor 簡介 建立乙...
Java執行緒池
executors類詳解 此包中所定義的 executor executorservice scheduledexecutorservice threadfactory 和 callable 類的工廠和實用方法。此類支援以下各種方法 建立並返回設定有常用配置字串的 executorservice 的...
Java執行緒池
一 執行緒池 單執行緒 public static void runsinglethreadpool public static void runsinglethreadpoolwithfactory private static class mythreadfactory implements t...