RecursiveTask的使用

package com.example.sina.thread;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
import java.util.stream.IntStream;

public class RecursiveTest {
    // 定义最小区间为10
    private final static int MAX_THRESHOLD = 100;

    public static void main(String[] args) {
        final ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoinTask<Integer> future = forkJoinPool.submit(new CalculateRecursiveTask(1, 1000));
        try {
            Integer result = future.get();
            System.out.println(result);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }

    private static class CalculateRecursiveTask extends RecursiveTask<Integer> {
        
        private static final long serialVersionUID = 1L;
        // 起始
        private int start;
        // 结束
        private int end;

        public CalculateRecursiveTask(int start, int end) {
            this.start = start;
            this.end = end;
        }

        @Override
        protected Integer compute() {
            // 如果起始和结束范围小于我们定义的区间范围,则直接计算
            if ((end - start) <= MAX_THRESHOLD) {
                return IntStream.rangeClosed(start, end).sum();
                
            } else {
                // 否则,将范围一分为二,分成两个子任务
                int middle = (start + end) / 2;
                CalculateRecursiveTask leftTask = new CalculateRecursiveTask(start, middle);
                CalculateRecursiveTask rightTask = new CalculateRecursiveTask(middle + 1, end);
                // 执行子任务
                leftTask.fork();
                rightTask.fork();

                // 汇总子任务
                return leftTask.join() + rightTask.join();
            }
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,`ForkJoinPool`和`ForkJoinTask`类可以用于并行执行任务。下面是一个使用`ForkJoinPool`和`ForkJoinTask`的示例: ``` import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveTask; public class ForkJoinExample { public static void main(String[] args) { ForkJoinPool forkJoinPool = new ForkJoinPool(); int result = forkJoinPool.invoke(new SumTask(1, 100)); System.out.println("Sum of 1 to 100 is " + result); } static class SumTask extends RecursiveTask<Integer> { private static final int THRESHOLD = 10; private int from; private int to; public SumTask(int from, int to) { this.from = from; this.to = to; } @Override protected Integer compute() { if (to - from <= THRESHOLD) { int sum = 0; for (int i = from; i <= to; i++) { sum += i; } return sum; } else { int mid = (from + to) / 2; SumTask leftTask = new SumTask(from, mid); SumTask rightTask = new SumTask(mid + 1, to); leftTask.fork(); rightTask.fork(); return leftTask.join() + rightTask.join(); } } } } ``` 在上面的示例中,我们创建了一个`SumTask`类,它继承了`RecursiveTask<Integer>`类。`RecursiveTask`是一个抽象类,我们需要实现`compute()`方法来完成我们的任务。 `SumTask`用于计算从`from`到`to`之间的整数的总和。如果`to - from`小于或等于一个固定的阈值(`THRESHOLD`),则任务将直接计算总和。否则,任务将被拆分成两个子任务并分别计算。我们使用`fork()`方法启动子任务,并使用`join()`方法等待子任务完成并返回结果。 在`main()`方法中,我们创建了一个`ForkJoinPool`来执行我们的任务,并使用`invoke()`方法启动任务。`invoke()`方法将阻塞直到任务完成,并返回结果。最后,我们打印出计算结果。 这是一个简单的使用`ForkJoinPool`和`ForkJoinTask`的示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值