首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ForkJoin框架

ForkJoin框架

作者头像
DH镔
发布2019-12-19 18:42:48
3370
发布2019-12-19 18:42:48
举报

Forkjoin

Fork/Join框架继承ExecutorService接口,帮助我们方便利用多处理器的优点。它专为可以递归分解成小块的工作而设计。目标是使用所有可用的处理能力来提高应用程序的性能。

和所有实现ExecutorService接口的一样,fork/join框架将任务分配给线程池中的工作线程,不同的是,fork/join框架使用了"工作窃取"算法。比如要完成一个比较大的任务,完全可以把这个任务分割成若干个互不依赖的小任务/子任务。为了方便地管理这些任务,于是把这些子任务分别放到不同的队列里,这时就会出现有的线程会先把自己队列里的任务快速执行完毕,而其他线程对应的队列里还有任务等待处理,完成任务的线程与其等着,不如去帮助其他线程分担要执行的任务,于是它就去其他线程的队列里窃取一个任务来执行。

RecursiveTaskUML图.png
RecursiveTaskUML图.png

主要的方法

RecursiveTaskUML方法图.png
RecursiveTaskUML方法图.png

RecursiveTask例子

/**
 * @author donghaibin
 * @date 2019-08-17
 */
@RequiredArgsConstructor
public class SumTask extends RecursiveTask<Integer> {

    private static final int THRESHOLD = 10;

    private final int[] data;
    private final int start;
    private final int end;


    private int sum(int[] data, int start, int end) {
        int result = 0;
        for (int i = start; i < end; i++) {
            result += data[i];
        }
        return result;
    }

    @Override
    protected Integer compute() {
        if (end - start < THRESHOLD) {
            return sum(data, start, end);
        }
        int middle = (start + end) / 2;
        SumTask left = new SumTask(data, start, middle);
        SumTask right = new SumTask(data, middle, end);
        left.fork();
        right.fork();
        return left.join() + right.join();
    }


}
/**
 * @author donghaibin
 * @date 2019-08-17
 */
public class ForkJoinDemo {

    public static void main(String[] args) {
        int[] ints = IntStream.rangeClosed(1, 100).toArray();
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoinTask<Integer> task = forkJoinPool.submit(new SumTask(ints, 0, ints.length));
        Integer result = task.invoke();
        System.out.println(result);
    }
}
运行结果:
1050

RecursiveAction和RecursiveTask的区别是没有返回值,在不需要返回数据的时候可以使用RecursiveActionForkJoinPool继承ExecutorService用于创建执行线程池,用法基本上和ExectorService一致。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档