ForkJoinPool的工作原理和使用

2021-10-04 22:59:44 字數 1270 閱讀 3454

場景:當任務很多,成千上萬個,或者單個任務很大,執行起來很耗時間,這時,就可以把任務進行拆分,拆分成多個小任務去執行,然後小任務執行完畢後再把每個小任務執行的結果合併起來,這樣就可以節省時間。

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 是更好的執行緒池的技術,主要是面向目前的多執行緒高併發的場景提供的底層工具,理念和效能上比原來的執行緒池模式高不少 沒...