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(); // 合并
}
}
}