Java ForkJoin的使用

80 阅读1分钟
package com.test.testforkjoin;

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

/**
 * @author Administrator
 */
public class ForkJoinCalculate extends RecursiveTask<Long> {

    private static final long THRESHOLD = 10000;
    private Long start;
    private Long end;

    public ForkJoinCalculate(Long start, Long end) {
        this.start = start;
        this.end = end;
    }
    @Override
    protected Long compute() {

        long sum = 0;
        long length = end -start;
        if (length < THRESHOLD) {
            for (long i = start; i < end; i++) {
                sum += i;
            }
            return sum;
        } else {
            long middle = (end + start)/2;
            ForkJoinCalculate left = new ForkJoinCalculate(start,middle);
            left.fork();
            ForkJoinCalculate right = new ForkJoinCalculate(middle + 1, end);
            right.fork();
            return left.join() + right.join();
        }
    }

    public static void main(String[] args) {

        Instant start = Instant.now();
        ForkJoinPool pool = new ForkJoinPool();

        ForkJoinTask<Long> task = new ForkJoinCalculate(0L, 10000000000L);
        Long sum = pool.invoke(task);
        System.out.println(sum);
        Instant end = Instant.now();
        System.out.println(Duration.between(start, end).toMillis());
        normal();
    }

    public static void normal() {

        Long sum = 0L;
        Instant start = Instant.now();
        for (long i = 0; i < 10000000000L; i++) {
            sum += i;
        }
        Instant end = Instant.now();
        System.out.println(">>>>"+Duration.between(start, end).toMillis());
    }
}

测试结果:

-5345475101129947011
1170
>>>>20258