乙個forkjoinpool 對應多個forkjoinworkerthread
乙個forkjoinworkerthread 對應多個forkjointask
以乙個簡單的求和task為例:
public class forkjointest catch (interruptedexception | executionexception e)
}}
class task extends recursivetask
@override
protected integer compute()
} else
return sum; }
}
1. forkjoinworkerthread 的exectask方法(解決自己forkjoinworkerthread的task呼叫)
final void exectask(forkjointask<?> t)
++stealcount;
currentsteal = null;
}
這裡就是執行task,當執行完成會取出當前forkjoinworkerthread的下乙個forkjointask,如果已經區空了就會跳出迴圈
2. forkjoinworkerthread 的scan方法(解決別人以及自己forkjoinworkerthread的task呼叫)
private boolean scan(forkjoinworkerthread w, int a)
r ^= r << 13; r ^= r >>> 17; w.seed = r ^ (r << 5);
return false; // store next seed
}else if (j < 0)
else
++k;
}if (scanguard != g) // staleness check
return false;
else
return false;
}return true; // all queues empty
}}
當exectask迴圈跳出,會執行scan方法,嘗試從其他的forkjoinworkerthread中取出forkjointask 然後呼叫exectask方法
3. forkjointask的invokeall方法(解決如何分配task的問題)
public static void invokeall(forkjointask<?> t1, forkjointask<?> t2)
step 1:把t2壓入當前forkjoinworkerthread的queue中,要麼當前forkjoinworkerthread會去消費,要麼會有空閒的forkjoinworkerthread去消費
step 2:當前forkjoinworkerthread繼續執行t1
step3: 當前forkjoinworkerthread等待t2的完成
invokeall方法往往是在compute()方法中呼叫,整體處理過程還是很符合邏輯的。
《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具
檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...
Cartographer原始碼篇 原始碼分析 1
在安裝編譯cartographer 1.0.0的時候,我們可以看到 主要包括cartorgarpher ros cartographer ceres sover三個部分。其中,ceres solver用於非線性優化,求解最小二乘問題 cartographer ros為ros平台的封裝,獲取感測器資料...
python原始碼剖析 Python原始碼剖析
第頁共 頁python 原始碼剖析 物件機制 1.物件 在python 的世界中,一切都是物件,乙個整數是乙個物件,乙個字串也是 乙個物件,更為奇妙的是,型別也是乙個物件,整數型別是乙個物件,字串類 型也是乙個物件。從 年guido 在那個聖誕節揭開 python 世界的大幕開始,一直到現在,pyt...