場景:當任務很多,成千上萬個,或者單個任務很大,執行起來很耗時間,這時,就可以把任務進行拆分,拆分成多個小任務去執行,然後小任務執行完畢後再把每個小任務執行的結果合併起來,這樣就可以節省時間。
forkjoinpool實現了executorservice介面,所以它也是一種執行緒池,做的工作就是,把乙個任務拆分成若干個小任務執行,然後再把小任務執行的結果彙總。
下面是乙個小例子:
//初始化乙個forkjoinpool
static forkjoinpool pool = new forkjoinpool(3,
forkjoinpool.defaultforkjoinworkerthreadfactory,
null,
true);
//乙個集合,模擬**
static arraylistlist = new arraylist<>();
//集合中的資料
static void addlist()
public static void main(string args) throws executionexception, interruptedexception
//模擬請求
public static string dorequest(string url, int index)
//需要繼承recursivetask,來實現自己的拆分邏輯
static class work extends recursivetask
@override
protected string compute() {
int count = end - start;
string result = "";
//當任務小於10個時直接執行,否則就拆分
if (count <= 10) {
for (int i = 0; i執行邏輯:
第一步:
第二步:
第三步:
每乙個執行緒有任務後,都會去拆分任務,當拆分的小任務滿足執行條件後,就會去執行,然後按照層級,從拆分後最小的層級執行完任務,一層層向上**任務結果,最後到forkjointask中,然後就可以獲取到每乙個小任務執行的結果。
ForkJoinPool 原始碼分析
乙個forkjoinpool 對應多個forkjoinworkerthread 乙個forkjoinworkerthread 對應多個forkjointask 以乙個簡單的求和task為例 public class forkjointest catch interruptedexception ex...
ForkJoinPool 使用的錯誤寫法
compute分出多個task後 以task1,task2為例 錯誤做法 1 依次執行task1.fork task2.fork 2 依次執行task1.join task2.join 正確做法 1 直接呼叫invokeall task1,task2 fork 把task置入當前forkjoinwo...
說一下 jdk7 的 ForkJoinPool
by yinmingjun 網上找了一下 forkjoinpool 的資料,發現資料不多,看來大多的兄弟還留在 executors 的坑里沒出來。簡單的說,forkjoinpool 是更好的執行緒池的技術,主要是面向目前的多執行緒高併發的場景提供的底層工具,理念和效能上比原來的執行緒池模式高不少 沒...