java併發程式設計:執行緒池的使用

yeohx發表於2018-04-13

問題:

飢餓死鎖:當前任務依賴後續任務完成,但是後續任務沒有資源。比如單執行緒池裡面的資源等待下一個任務的執行結果。

執行時間較長:長時間的任務先執行,導致後續任務一直等待

解決

問題一:

合理設定執行緒池大小。預先判斷任務之間的依賴關係。保證依賴任務都可以得到執行。

問題二:

合理安排執行緒池裡的任務,一個簡單解決方法是將任務分類。

合理設定執行緒池大小:

執行緒池數 = cpu數量*cpu使用率*(1 + 等待時間/計算時間)

配置threadpoolexecutor

java併發程式設計:執行緒池的使用
corepoolsize 核心執行緒數
maximumpoolsize 最大執行緒數
keepalivetime 執行緒執行時間
timeunit 時間單位
workqueue 等待佇列
threadfactory 執行緒工廠
rejectexecutionhandler 決絕策略
執行緒工廠:

java併發程式設計:執行緒池的使用

java併發程式設計:執行緒池的使用

設定threadpoolexecutor

呼叫set方法

java併發程式設計:執行緒池的使用

擴充套件:threadpoolexecutor

beforExecutor

afterExecutor

terminated

java併發程式設計:執行緒池的使用

遞迴演算法並行化:

遞迴過程中每一次呼叫都提交給新的程式執行。

例子:

抽象模型 遍歷一個物件(樹)
答案可能在樹的摸一個節點:遍歷過程是一次遞迴呼叫。
檢視一個節點作為一個獨立任務。在遞迴遍歷樹的過程中將每一個節點的計算任務交給一個程式執行。
避免無限迴圈需要一個結束標誌:建立一個閉鎖。執行緒安全的變數

java併發程式設計:執行緒池的使用
為了避免找不到答案的無限迴圈:
儲存所有任務執行記錄,當沒有任務執行之後則退出;

java併發程式設計:執行緒池的使用
設定時間長度,超過時間限制則退出。

相關文章