ForkJoinPool 原始碼分析

2021-08-14 21:37:47 字數 1767 閱讀 2011

乙個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...