一、ForkJoin是什么?它能用来实现什么功能?
ForkJoin也是一种线程池,只不过ForkJoin是专为CPU密集型任务而建立的线程池,它能大大提高CPU密集型任务的执行效率。
二、ForkJoin的实现原理
三、ForkJoin的简单使用
package com.muyichen.demo.forkjoin; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.Future; import java.util.concurrent.RecursiveTask; @Slf4j public class ForkJoinExample extends RecursiveTask<Integer> {
public static final int threshold = 2; private int start; private int end; public ForkJoinExample(int start, int end) {
this.start = start; this.end = end; } @Override protected Integer compute() {
int sum = 0; //如果任务足够小就计算任务 boolean canCompute = (end - start) <= threshold; if (canCompute) {
for (int i = start; i <= end; i++) {
sum += i; } } else {
// 如果任务大于阈值,就分裂成两个子任务计算 int middle = (start + end) / 2; ForkJoinExample leftTask = new ForkJoinExample(start, middle); ForkJoinExample rightTask = new ForkJoinExample(middle + 1, end); // 执行子任务 leftTask.fork(); rightTask.fork(); // 等待任务执行结束合并其结果 int leftResult = leftTask.join(); int rightResult = rightTask.join(); // 合并子任务 sum = leftResult + rightResult; } return sum; } public static void main(String[] args) {
ForkJoinPool forkjoinPool = new ForkJoinPool(); //生成一个计算任务,计算1加到100 ForkJoinExample task = new ForkJoinExample(1, 100); //执行一个任务 Future<Integer> result = forkjoinPool.submit(task); try {
log.info("result:{}", result.get()); } catch (Exception e) {
log.error("exception", e); } } }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230664.html原文链接:https://javaforall.net
