步驟1 :自定義拒絕策略介面
1)執行緒池狀態
threadpoolexecutor使用int的高3位來表示執行緒池狀態,低29位表示執行緒數量
從數字上比較,terminated>tidying>stop>shutdown>running
這些資訊儲存在乙個原子變數ctl中目的是將執行緒池狀態與執行緒個數合二為一,這樣就可以用一次cas原子操作進行賦值
2)構造方法
當高峰過去後,超過corepoolsize的救急執行緒如果一段時間沒有任務做,需要結束節省資源,這個時間由keepalivetime和unit來控制。
根據這個構造方法,jdk executors 類中提供了眾多任務廠方法來建立各種用途的執行緒池
特點核心執行緒數 == 最大執行緒數 (沒有救急執行緒被建立),因此也需超時時間
阻塞佇列是無界的,可以放任意數量的任務
適用於任務量已知,相對耗時的任務
特點核心執行緒數是0,最大執行緒數是integer.max_value,救急執行緒的空閒生存時間是60s,意味著
佇列採用了synchronousqueue 實現特點是,它沒有容量,沒有執行緒來取是放不進去的(一手交錢、一手交貨)
評價
整個執行緒池表現為執行緒數會根據任務量不斷增長,沒有上限,當任務執行完畢,空閒一分鐘後釋放執行緒。適合任務數比較密集,但每個任務執行時間較短的情況
5)newsinglethreadexecutor
使用場景 :
希望多個任務排隊執行。執行緒數固定為1,任務數多於1時,會放入無界佇列排隊。任務執行完畢,這唯一的執行緒也不會被釋放。
區別 :
自己建立乙個單執行緒序列執行任務,如果任務執行失敗而終止那麼沒有任務補救措施,而執行緒池還會新建乙個執行緒,保證池的正常工作
executors.newsinglethreadexecutor()執行緒個數始終為1,不能修改
executors.newfixedthreadpool(1)初始化時為1,以後還可以修改
1.定義
3. 建立多少執行緒池合適
1) 概念
fork/join 是 jdk 1.7加入的新的執行緒池實現,它體現的是一種分治思想,適用於能夠進行任務拆分的cpu密集型運算
所謂的任務拆分,是將乙個大任務拆分為演算法上相同的小任務,直至不能拆分可以直接求解。跟遞迴相關的一些計算,如歸併排序、斐波那契數列、都可以用分治思想進行求解
for/join 在分治的基礎上加入多執行緒,可以把每個任務的分解和合併交給不同的執行緒來完成,進一步提公升了運算效率
fork/join 缺省會建立於cpu核心數大小相同的執行緒池
2)使用
提交給fork/ join執行緒池的任務需要繼承 recursivetask (有返回值)或recursiveaction(沒有返回值),列如下面定義了乙個隊1~n之間的整數求和的任務
用圖來表示
改進優化:
用圖來表示 :
併發程式設計之 執行緒池
執行緒池做的工作主要是控制執行的執行緒的數量,處理過程中將任務放入佇列,然後再執行緒建立後啟動這些任務,如果執行緒數量超過了最大數量,超出數量的執行緒排隊等候,等其它執行緒執行完畢,再從佇列中取出任務來執行。他的主要特點為 執行緒復用 控制最大併發數,管理執行緒。第一 降低資源消耗。通過重複利用已建...
併發程式設計之執行緒池,程序池
池 受限於硬體的發展,硬體跟不上軟體的發展 在保證計算機硬體安全的情況下,最大限度的利用了計算機 池其實是降低了程式的執行效率,但是保證了計算機硬體的安全 我們再使用程序和執行緒時,不可能無限制的去開程序或執行緒。因此我們需要用到程序池,執行緒池來解決這一問題。1.concurrent模組是用來建立...
Java併發程式設計之執行緒池的使用(一)
為什麼使用執行緒池呢?在單執行緒的情況下,只有處理完乙個請求之後,才會去處理下乙個請求,但是在一些io操作阻塞的過程中,cpu是空閒的狀態,這個時候單執行緒不可能去利用cpu去處理其他請求,但是多執行緒就可以實現。但是使用多執行緒的時候,並且每個執行緒都是執行乙個時間很短的任務就結束了,這樣頻繁建立...