Java 多線程 fork-join


fork-join我們可以理解為分而治之,就是說當一個任務非常大的時候,我們可以按照一定的業務需求拆分為若干個小的任務,最后把這些小的任務再聚合起來。

下面就通過fork-join實現一個從1加到100的多線程實現方式。

首先定義類SumTask,必須繼承RecursiveTask<Integer>,表示返回Integer類型。 

private static class SumTask extends RecursiveTask<Integer> {
    private final static int THRESHOLD = 10;// 閥值,當數組長度小於10就不再拆分
    int[] array = null;
    int start;
    int end;

    public SumTask(int[] array, int start, int end) {
        this.array = array;
        this.start = start;
        this.end = end;
    }

    @Override
    protected Integer compute() {
        if (end - start <= THRESHOLD) {
            // 直接求和
            int sum = 0;
            for (int i = start; i <= end; i++) {
                sum += this.array[i];
            }
            return sum;
        } else {
            // 拆分
            int mid = (start + end) / 2;
            SumTask left = new SumTask(array, start, mid);
            SumTask right = new SumTask(array, mid + 1, end);
            invokeAll(left, right);
            return left.join() + right.join();
        }
    }

}

 

然后主方法如下:

public static void main(String[] args) {
    // 定義數組
    int[] arr = new int[100];
    for (int i = 0; i < 100; i++) {
        arr[i] = i + 1;
    }

    ForkJoinPool pool = new ForkJoinPool();
    SumTask innerFind = new SumTask(arr, 0, arr.length - 1);
    pool.invoke(innerFind);// 同步調用
    System.out.println("完成,結果是:" + innerFind.join());
}

 

注意:

1.如果有返回值就繼承RecursiveTask,沒有返回值就繼承RecursiveAction

2.上面是同步調用,如果想要異步調用,可以使用pool.execute(...);替換上面的invoke方法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM