java 8 ForkJoin 框架使用示例

206 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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

/**
 * @Author: 
 * @CreateTime: 2020/12/20 22:53
 * @Description:
 */
public class TestForkJoinPool {


    public static void main(String[] args) {
        Instant startTime = Instant.now();
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoinTask<Long> forkJoinSum = new ForkJoinSum(0, 1000000L);
        Long result = forkJoinPool.invoke(forkJoinSum);
        System.out.println(result);
        Instant endTime = Instant.now();
        System.out.println("耗费时间为: "+ Duration.between(startTime,endTime).toMillis());
    }
}

/**
 * RecursiveAction 无返回值
 * RecursiveTask  有返回值
 */
class  ForkJoinSum extends RecursiveTask {

    private long start;
    private long end;
    private static final  long  critical = 100000L;


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

    @Override
    protected Long compute() {
        long value = end - start;
        if (value<= critical) {
            long sum = 0;
            for (long i = start; i<=end;i++) {
                sum += i;
            }
            return  sum;
        } else {
            long middle = (start +end)/2;
            ForkJoinSum left = new ForkJoinSum(start,middle);
            // 进行拆分,同时压入线程队列
            left.fork();

            ForkJoinSum right = new ForkJoinSum(middle+1,end);
            // 进行拆分,同时压入线程队列
            right.fork();
            return (Long) left.join() + (Long) right.join();
        }
    }
}

java 8 的并行计算API

 long reduce = LongStream.rangeClosed(0L, Long.MAX_VALUE).parallel().reduce(0l, Long::sum);
        System.out.println(reduce);