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<Integer> future = forkJoinPool.submit(task);
        System.out.println("计算结果为:"+future.get());
        forkJoinPool.shutdown();
    }

    static class CountSumTask extends RecursiveTask<Integer> {
        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();
            }
        }
    }
}

本文参考自 Fork/Join 实战相关的一道面试题解析

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、多线程 说明下线程的状态 java中的线程一共有 5 种状态。 NEW:这种情况指的是,通过 New 关键字创...
    Java旅行者阅读 4,829评论 0 44
  • 在这篇文章中,将覆盖如下内容: 什么是Fork/Join框架 工作窃取算法 Fork/Join框架的设计 Recu...
    打铁大师阅读 770评论 0 3
  • 我不值得你爱, 我瘦得前胸贴后背, 我衣不遮体还要太阳晒。 闭上你的臭嘴! 再说我就踢你的腿! 就你这样把我的心操...
    木貞ma阅读 500评论 7 2
  • 我爱的人 爱我的人 谢谢你 谢谢你的不忍心 三生三世 刻于心里 走了, 勿念, 却十分想念!
    当向上翊遇上文艺翊阅读 233评论 0 0
  • [微笑]小故事大道理:牛是怎么死的? 看懂了至少成熟30年。 牛耕田回来,躺在栏里,疲惫不堪地喘着粗气,狗跑过来看...
    Jack_teacher阅读 291评论 0 0

友情链接更多精彩内容