java並行計算Fork和Join的使用

Java在JDK7以後加入了並行計算的框架Fork/Join,能夠解決咱們系統中大數據計算的性能問題。Fork/Join採用的是分治法,Fork是將一個大任務拆分紅若干個子任務,子任務分別去計算,而Join是獲取到子任務的計算結果,而後合併,這個是遞歸的過程。子任務被分配到不一樣的核上執行時,效率最高。java

package com.thread.forkjoin;

import java.util.Arrays;
import java.util.Random;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;

/**
 * Java在JDK7以後加入了並行計算的框架Fork/Join,能夠解決咱們系統中大數據計算的性能問題。
 * Fork/Join採用的是分治法,Fork是將一個大任務拆分紅若干個子任務,子任務分別去計算,而Join是獲取到子任務的計算結果,而後合併,這個是遞歸的過程。
 * 子任務被分配到不一樣的核上執行時,效率最高。
 */
public class ForkJoinTest extends RecursiveTask<Long> {
    private static final int THREADSHOLD = 50000;
    private long[] array;
    private int low;
    private int hight;

    public ForkJoinTest(long[] array, int low, int hight) {
        this.array = array;
        this.low = low;
        this.hight = hight;
    }

    @Override
    protected Long compute() {
        long sum = 0;
        if (hight - low < THREADSHOLD) {
            for (int i = low; i < hight; i++) {
                sum += array[i];
            }
        } else {
            int middle = (low + hight) >>> 1;
            ForkJoinTest left = new ForkJoinTest(array, low, middle);
            ForkJoinTest right = new ForkJoinTest(array, middle + 1, hight);

            left.fork();
            right.fork();

            sum = left.join() + right.join();
        }
        return sum;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        long[] array = genArray(1000000);
        System.out.println(Arrays.toString(array));

        ForkJoinTest forkJoinTest = new ForkJoinTest(array, 0, array.length - 1);
        long begin = System.currentTimeMillis();

        ForkJoinPool forkJoinPool = new ForkJoinPool();
        forkJoinPool.submit(forkJoinTest);
        Long result = forkJoinTest.get();

        long end = System.currentTimeMillis();

        System.out.println(String.format("結果 %s 耗時 %sms", result, end - begin));
    }

    private static long[] genArray(int size) {
        long[] array = new long[size];
        for (int i = 0; i < size; i++) {
            array[i] = new Random().nextLong();
        }
        return array;
    }
}
相關文章
相關標籤/搜索