本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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);