ForkJoinPool_分支合并框架工作窃取

ForkJoinPool_分支合并框架工作窃取

import java.time.Duration;
import java.time.Instant;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
import java.util.stream.LongStream;

public class ForkJoinPoolDemo {
    
    
    /**
     * Java7之前
     */
//    public static void main(String[] args) {
    
    
//        Instant start = Instant.now();
//        ForkJoinPool pool = new ForkJoinPool();
//        ForkJoinTask<Long> task = new ForkJoinSumCalculate(0l, 500000000l);
//        Long sum = pool.invoke(task);
//        System.out.println(sum);
//        Instant end = Instant.now();
//        System.out.println("耗费时间为:" + Duration.between(start, end).toMillis());
//    }

//    public static void main(String[] args) {
    
    
//        Instant start = Instant.now();
//        long sum = 0l;
//        for (long i = 0l; i <= 500000000l; i++) {
    
    
//            sum += i;
//        }
//        System.out.println(sum);
//        Instant end = Instant.now();
//        System.out.println("耗费时间为:" + Duration.between(start, end).toMillis());
//    }

    /**
     * Java8实现
     *
     * @param args
     */
    public static void main(String[] args) {
    
    
        Instant start = Instant.now();
        Long sum = LongStream.rangeClosed(0L, 500000000L)
                .parallel()
                .reduce(0L, Long::sum);
        System.out.println(sum);
        Instant end = Instant.now();
        System.out.println("耗费时间为:" + Duration.between(start, end).toMillis());
    }

}

class ForkJoinSumCalculate extends RecursiveTask<Long> {
    
    
    private long start;
    private long end;
    private static final long THRESHOLD = 100000l; // 拆分门限值

    public ForkJoinSumCalculate(long start, long end) {
    
    
        this.start = start;
        this.end = end;
    }

    @Override
    protected Long compute() {
    
    
        long length = end - start;
        if (length <= THRESHOLD) {
    
    
            long sum = 0l;
            for (long i = start; i < end; i++) {
    
    
                sum += i;
            }
            return sum;
        } else {
    
    
            long middle = (start + end) / 2;
            ForkJoinSumCalculate left = new ForkJoinSumCalculate(start, middle);
            left.fork(); // 进行拆分,同时压入线程队列
            ForkJoinSumCalculate right = new ForkJoinSumCalculate(middle + 1, end);
            right.fork(); // 进行拆分,同时压入线程队列
            return left.join() + right.join(); // 合并
        }
    }
}

猜你喜欢

转载自blog.csdn.net/for62/article/details/107625781