Java Fork/Join 實戰(zhàn)

問:如何充分利用多核 CPU 計算很大 List 中所有整數(shù)的和?

答:這個題目的答案其實有好幾種解法,CyclicBarrier 或者 java8 的并行流都可以,但是這里使用 Fork/Join 來解答。

/**
 * 答案有刪減優(yōu)化,原文出處(網(wǎng)絡(luò)ID:since1986)
 * https://juejin.im/post/59be875e5188257e6b6d91c1
 * 如有侵權(quán)聯(lián)系小編刪文處理,謝謝
 */
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("計算結(jié)果為:"+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 實戰(zhàn)相關(guān)的一道面試題解析

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、多線程 說明下線程的狀態(tài) java中的線程一共有 5 種狀態(tài)。 NEW:這種情況指的是,通過 New 關(guān)鍵字創(chuàng)...
    Java旅行者閱讀 4,867評論 0 44
  • 在這篇文章中,將覆蓋如下內(nèi)容: 什么是Fork/Join框架 工作竊取算法 Fork/Join框架的設(shè)計 Recu...
    打鐵大師閱讀 777評論 0 3
  • 我不值得你愛, 我瘦得前胸貼后背, 我衣不遮體還要太陽曬。 閉上你的臭嘴! 再說我就踢你的腿! 就你這樣把我的心操...
    木貞ma閱讀 507評論 7 2
  • 我愛的人 愛我的人 謝謝你 謝謝你的不忍心 三生三世 刻于心里 走了, 勿念, 卻十分想念!
    當向上翊遇上文藝翊閱讀 234評論 0 0
  • [微笑]小故事大道理:牛是怎么死的? 看懂了至少成熟30年。 牛耕田回來,躺在欄里,疲憊不堪地喘著粗氣,狗跑過來看...
    Jack_teacher閱讀 305評論 0 0

友情鏈接更多精彩內(nèi)容