Java并发基础(七)

2019-08-29  本文已影响0人  smallmartial

1.fork/join示例

package com.zskj.concert.test.forkJoin;

import java.util.concurrent.RecursiveTask;

/**
 * @author cw
 * @date 2019/8/29
 */
public class ForkJoinSumCalculator extends RecursiveTask<Long> {
    private final long[] numbers;
    private final int start;
    private int end;
    public static final long THRESHOLD = 10L;

    public ForkJoinSumCalculator(long[] numbers) {
        this(numbers,0,numbers.length);
    }

    public ForkJoinSumCalculator(long numbers[], int start, int end) {
        this.numbers = numbers;
        this.start = start;
        this.end = end;
    }
    //负责求和
    @Override
    protected Long compute() {
        int length =end-start;
        if(length <=THRESHOLD){
            return computeSequentaily();
        }
        ForkJoinSumCalculator leftTask = new ForkJoinSumCalculator(numbers, start, start + length / 2);
        leftTask.fork();
        ForkJoinSumCalculator rightTask = new ForkJoinSumCalculator(numbers, start + length / 2, end);
        Long rightResult = rightTask.compute();
        Long leftResult = leftTask.join();
        return leftResult+rightResult;
    }
    //计算求和
    private Long computeSequentaily() {
        long sum = 0;
        for (int i = 0; i < end; i++) {
            sum += numbers[i];
        }
        return sum;
    }
}



//java8调用示例
    public static long forkJoinSum(long n){
        long[] numbers = LongStream.rangeClosed(1, n).toArray();
        ForkJoinSumCalculator task = new ForkJoinSumCalculator(numbers);
        return new ForkJoinPool().invoke(task);

    }

2使用分支/合并的最佳做法

3.工作窃取技术

上一篇 下一篇

猜你喜欢

热点阅读