java forkjoin 简书_Java Fork/Join 实战

问:如何充分利用多核 CPU 计算很大 List 中所有整数的和?

答:这个题目的答案其实有好几种解法,CyclicBarrier 或者 java8 的并行流都可以,但是这里使用 Fork/Join 来解答。

/**

* 答案有删减优化,原文出处(网络ID:since1986)

* https://juejin.im/post/59be875e5188257e6b6d91c1

* 如有侵权联系小编删文处理,谢谢

*/

public class ForkJoinLargeListSum {

public static void main(String[] args) throws InterruptedException, ExecutionException {

int[] array = IntStream.rangeClosed(0, 10000000).toArray();

ForkJoinPool forkJoinPool = new ForkJoinPool();

CountSumTask task = new CountSumTask(0, array.length, 10000, array);

Future future = forkJoinPool.submit(task);

System.out.println("计算结果为:"+future.get());

forkJoinPool.shutdown();

}

static class CountSumTask extends RecursiveTask {

private int high, low;

private int threshold;

private int[] array;

CountSumTask(int low, int high, int threshold, int[] array) {

this.array = array;

this.low = low;

this.high = high;

this.threshold = threshold;

}

@Override

protected Integer compute() {

if (high - low <= threshold) {

int sum = 0;

for (int i = low; i < high; i++) {

sum += array[i];

}

return sum;

} else {

int middle = (high - low) / 2 + low;

CountSumTask leftHandTask = new CountSumTask(low, middle, threshold, array);

CountSumTask rightHandTask = new CountSumTask(middle, high, threshold, array);

leftHandTask.fork();

rightHandTask.fork();

return leftHandTask.join() + rightHandTask.join();

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值