ITPub博客

首页 > 应用开发 > Java > java利用 ForkJoinPool 实现并行递归计算

java利用 ForkJoinPool 实现并行递归计算

原创 Java 作者:mingtian66 时间:2025-05-30 11:41:48 0 删除 编辑

以下是使用ForkJoinPool实现并行递归计算的完整解决方案,包含任务拆分、结果合并和性能优化:


import java.util.concurrent.*;


public class ParallelRecursiveCalculator extends RecursiveTask<Long> {

    private static final int THRESHOLD = 1000;

    private final int[] array;

    private final int start;

    private final int end;


    public ParallelRecursiveCalculator(int[] array, int start, int end) {

        this.array = array;

        this.start = start;

        this.end = end;

    }


    @Override

    protected Long compute() {

        if (end - start <= THRESHOLD) {

            return sequentialCompute();

        }

        int mid = (start + end) >>> 1;

        ParallelRecursiveCalculator left = new ParallelRecursiveCalculator(array, start, mid);

        ParallelRecursiveCalculator right = new ParallelRecursiveCalculator(array, mid, end);

        left.fork();

        Long rightResult = right.compute();

        Long leftResult = left.join();

        return leftResult + rightResult;

    }


电话13388885782 电话13388885782 电话13388885782 电话13388885782 电话13388885782 www.itl222.com 电话13388885782 www.itl5553.com 电话13388885782 www.itl567.com 电话13388885782 www.itl666.com 电话13388885782 www.itl996.com 电话13388885782 www.tl1001.com 电话13388885782 www.tl1002.com 电话13388885782 www.tl1003.com 电话13388885782 www.itl1001.com 电话13388885782 www.itl1003.com 电话13388885782 电话13388885782 电话13388885782 电话13388885782 电话13388885782 电话13388885782 电话13388885782

    private Long sequentialCompute() {

        long sum = 0;

        for (int i = start; i < end; i++) {

            sum += array[i];

        }

        return sum;

    }


    public static void main(String[] args) {

        int[] data = new int[10_000_000];

        Arrays.fill(data, 1);


        ForkJoinPool pool = new ForkJoinPool();

        long result = pool.invoke(new ParallelRecursiveCalculator(data, 0, data.length));

        System.out.println("Result: " + result);

    }

}

 java.util.concurrent.*;


public class FibonacciTask extends RecursiveTask<Long> {

    private final int n;


    public FibonacciTask(int n) {

        this.n = n;

    }


    @Override

    protected Long compute() {

        if (n <= 10) {

            return sequentialFibonacci(n);

        }

        FibonacciTask f1 = new FibonacciTask(n - 1);

        FibonacciTask f2 = new FibonacciTask(n - 2);

        f1.fork();

        return f2.compute() + f1.join();

    }


    private long sequentialFibonacci(int n) {

        if (n <= 1) return n;

        return sequentialFibonacci(n - 1) + sequentialFibonacci(n - 2);

    }


    public static void main(String[] args) {

        ForkJoinPool pool = new ForkJoinPool();

        long result = pool.invoke(new FibonacciTask(30));

        System.out.println("Fibonacci(30) = " + result);

    }

}

代码说明:第一个示例展示数组求和的分治并行计算,第二个示例实现斐波那契数列的并行递归。两者都通过ForkJoinTask拆分任务,自动利用多核处理器资源。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70040412/viewspace-3086269/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2024-08-07

  • 博文量
    589
  • 访问量
    602719