专栏首页房东的猫Java7 Fork/Join框架
原创

Java7 Fork/Join框架

简介

ForkJoin框架是Java7 提供的把一个大任务分割成若干个小任务,最终汇总每一个任务结果后得到大任务结果的框架。ForkJoinPool继承AbstractExecutorService,实现了Executor,ExecutorService。ForkJoinPool用来实现工作窃取算法。

Fork/Join框架主要包含三个模块:

  • 线程池:Fork/Join Pool
  • 任务对象:Fork/Join Task
  • 执行任务线程:Fork/Join WorkerThread

工作窃取算法

fork:将一个大任务根据条件不断的分割为互不依赖的小任务,并将这些小任务放入不同的队列,每个工作线程维护一个任务队列,当自己维护的任务队列为空时随机从别的任务队列获取任务执行。

join:最后再将这些小任务的结果都放在一个统一的队列当中,最后启动一个工作线程从这个结果队列中取数据合并得到最终的结果。

工作窃取算法中分割任务和合并结果的思想和Hadoop的MapReduce编程模型一样,优点是充分提高程序的并行度,有效的减少了线程之间的竞争,但是也会消耗过多的系统资源。

分治算法

把一个复杂的问题分解成多个相似的子问题,然后再把子问题分解成更小的问题,直到问题简单到可以直接求解。而大数据框架mapReduce就是分治的实现。Fork、Join计算框架主要用于处理CPU型任务,主要包含分治任务线程池 ForkJoinPool和分治任务ForkJoinTask。

Fork/Join案例

需求:使用Fork/Join计算1-1000000和。当一个任务的计算数量大于3000的时候拆分任务,数量小于3000的时候就计算。

public class SumRecursiveTask extends RecursiveTask<Long> {

    /**
     * 定义一个临界拆分值
     * @return
     */
    private static final long THRESHOLD = 3000;
    private final long start;
    private final long end;

    public SumRecursiveTask(long start, long end) {
        this.start = start;
        this.end = end;
    }

    @Override
    protected Long compute() {

        long length = end - start;
        if (length <= THRESHOLD) {
            // 任务不需要拆分,可以计算
            long sum = 0;
            for (long i = start; i <= end; i++) {
                sum += i;
            }
            System.out.println("计算:" + start + "--->" + end + "的结果为:" + sum);
            return sum;
        } else {
            // 数量大于预订,需要拆分
            long middle = (start + end)/2;
            System.out.println("拆分左边:" + start + "--->" + middle + ", 右边" + (middle + 1) + "--->" + end);

            SumRecursiveTask left = new SumRecursiveTask(start, middle);
            left.fork();

            SumRecursiveTask right = new SumRecursiveTask(middle + 1, end);
            right.fork();

            return left.join() + right.join();
        }
    }
}
@Test
public void test() {

    long start = System.currentTimeMillis();
    ForkJoinPool pool = new ForkJoinPool();

    SumRecursiveTask task = new SumRecursiveTask(1, 10000L);
    Long result = pool.invoke(task);
    System.out.println("result:" + result);

    long end = System.currentTimeMillis();
    System.out.println("总耗时:" + (end - start));
}

输出结果:

拆分左边:1--->5000, 右边5001--->10000
拆分左边:1--->2500, 右边2501--->5000
拆分左边:5001--->7500, 右边7501--->10000
计算:5001--->7500的结果为:15626250
计算:1--->2500的结果为:3126250
计算:2501--->5000的结果为:9376250
计算:7501--->10000的结果为:21876250
result:50005000
总耗时:6

原创声明,本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

登录 后参与评论
0 条评论

相关文章

  • Java7任务并行执行神器:Fork&Join框架

    Fork/Join是什么? Fork/Join框架是Java7提供的并行执行任务框架,思想是将大任务分解成小任务,然后小任务又可以继续分解,然后每个小任务分别计...

    Java技术栈
  • java中的fork join框架

    fork join框架是java 7中引入框架,这个框架的引入主要是为了提升并行计算的能力。

    程序那些事
  • Fork Join 并发任务执行框架

    规模为N的问题,如果N<阈值,直接解决,N>阈值,将N分解为K个小规模子问题,子问题互相对立,与原问题形式相同,将子问题的解合并得到原问题的解

    彼岸舞
  • 【Java】Fork-join框架学习笔记

    Fork-Join是什么? Fork-Join是Java的一个并行框架,主要的作用是将大任务分解为多个小任务,交由多个工作线程运行,最后将小任务的计算结果汇总,...

    啦啦啦321
  • Fork join并发框架与工作窃取算法剖析

    Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。

    Java技术江湖
  • fork-join挺好用的了,fork-join_any、fork-join_none有什么用?

    我们早在学习Verilog语言时就学过:相对于begin-end顺序执行的语句块,还存在fork-join并行执行的语句块。这些知识用起来已经很顺手了,但是当学...

    IC验证
  • SystemVerilog中从event看fork...join执行顺序

    前面我写过一篇关于event的文章。SystemVerilog中event,今天再来说点新花样。本次仿真使用的仿真器是VCS2019.06

    数字IC小站
  • Verilog 的块语句 fork...join 和 begin...end

    1. 块语句有两种,一种是 begin-end 语句, 通常用来标志()执行的语句;一种是 fork-join 语句,通常用来标志()执行的语句。

    FPGA探索者
  • Java中J.U.C扩展组件之Fork,join

    入门小站
  • Fork/Jion框架详解

    如果你要处理1万条数据,但是你的能力暂时还不够,一个简单快捷的办法就是你可以把每次只处理100条,等到处理100次之后再把所有的结果聚合起来你就处理完了这1万条...

    Java学习录
  • (十二)J.U.C-ForkJoin

    ForkJoin是Java7提供的一个并行执行任务的框架,是把大任务分割成若干个小任务,待小任务完成后将结果汇总成大任务结果的框架。主要采用的是工作窃取算法,工...

    用户1212940
  • 分治算法与Fork/Join框架

    在计算机科学中,分治法是解决多项式分支递归的重要范式;也就是“分而治之”,将复杂问题分成两个或更多相似的子问题,然后将简单的子问题求解,再将子问题的解合并。有很...

    搬砖俱乐部
  • for循环+fork-join_none结构的坑,你有注意到吗?

    fork-join_none相信大家应该熟悉了,新来的朋友可以回顾下jerry之前的文章,就是之前jerry提到的那个“暴脾气”的哥们,他不会去等别人,直接会着...

    IC验证
  • 【高并发】如何使用Java7中提供的Fork/Join框架实现高并发程序?

    作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了...

    冰河
  • 【小家java】java7新特性(简述八大新特性) 不温不火

    编译器在编译时先做处理: ①case仅仅有一种情况。直接转成if。 ②假设仅仅有一个case和default,则直接转换为if…else…。 ③有多个ca...

    YourBatman
  • Java并发学习4【面试+工作】

    Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。

    Java帮帮
  • ForkJoin 学习使用笔记

    ForkJoin 学习使用笔记 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结...

    一灰灰blog
  • 浅析Java的Frok/Join框架 一丶Fork/Join框架产生背景:二丶工作窃取算法三丶Fork/Join框架的设计思想四丶JDK实现Fork/Join框架五丶ForkJoin框架的实现原理

    一丶Fork/Join框架产生背景: 随着并发需求的不断提高和硬件的不断发展,程序并行执行仿佛就提上日程上来了,伟大的毛主席就说过:“人多力量大”,所以如果一件...

    MindMrWang
  • JAVA并行框架:Fork/Join

    转载自 https://www.cnblogs.com/dongguacai/p/6021859.html

    allsmallpig

扫码关注云+社区

领取腾讯云代金券