問題:
飢餓死鎖:當前任務依賴後續任務完成,但是後續任務沒有資源。比如單執行緒池裡面的資源等待下一個任務的執行結果。
執行時間較長:長時間的任務先執行,導致後續任務一直等待
解決
問題一:
合理設定執行緒池大小。預先判斷任務之間的依賴關係。保證依賴任務都可以得到執行。
問題二:
合理安排執行緒池裡的任務,一個簡單解決方法是將任務分類。
合理設定執行緒池大小:
執行緒池數 = cpu數量*cpu使用率*(1 + 等待時間/計算時間)
配置threadpoolexecutor
corepoolsize 核心執行緒數maximumpoolsize 最大執行緒數
keepalivetime 執行緒執行時間
timeunit 時間單位
workqueue 等待佇列
threadfactory 執行緒工廠
rejectexecutionhandler 決絕策略
執行緒工廠:
設定threadpoolexecutor
呼叫set方法
擴充套件:threadpoolexecutor
beforExecutor
afterExecutor
terminated
遞迴演算法並行化:
遞迴過程中每一次呼叫都提交給新的程式執行。
例子:
抽象模型
遍歷一個物件(樹)
答案可能在樹的摸一個節點:遍歷過程是一次遞迴呼叫。
檢視一個節點作為一個獨立任務。在遞迴遍歷樹的過程中將每一個節點的計算任務交給一個程式執行。
避免無限迴圈需要一個結束標誌:建立一個閉鎖。執行緒安全的變數
儲存所有任務執行記錄,當沒有任務執行之後則退出;
設定時間長度,超過時間限制則退出。