java-forkjoin框架使用和一些原则

先扯一波使用 两个demo解决

  1. 使用RecursiveAction无状态任务拆分(无返回值状态)

注意几个点

  • awaitQuiescence 是监控这个forkjoin是否都完成
  • awaitTermination 是监控这个forkjoin是否shutdown
  • 使用execute表示用无返回值的方法来处理异步请求
public class TestForkJoin {
    public static void main(String[] args) throws InterruptedException {
        ForkJoinPool forkJoinPool = new ForkJoinPool(8);
        MyRecursiveAction myRecursiveAction = new MyRecursiveAction(new int[]{
                1,2,3,4,5,6,7,8,9
        },0,8);
        forkJoinPool.execute(myRecursiveAction);
        //阻塞当前线程直到 ForkJoinPool 中所有的任务都执行结束
        // awaitQuiescence 阻塞判断当前的线程是否都是完成的
        while(!forkJoinPool.awaitQuiescence(50,TimeUnit.NANOSECONDS)){

        }
        forkJoinPool.shutdown();
        forkJoinPool.awaitTermination(50,TimeUnit.DAYS);
        System.out.println("nb");
    }
}

class MyRecursiveAction extends RecursiveAction{
    private int[] itemList;
    private int start;
    private int end;

    public MyRecursiveAction(int[] itemList,int start,int end){
        this.itemList = itemList;
        this.start = start;
        this.end = end;
    }
    /**
     * The main computation performed by this task.
     */
    @Override
    protected void compute() {
        if(start>end){
            return;
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if(end+1-start>3){
            MyRecursiveAction recursiveAction = new MyRecursiveAction(itemList,start,start+2);
            MyRecursiveAction recursiveAction2 = new MyRecursiveAction(itemList,start+3,end);
            recursiveAction.fork();
            System.out.println("one end");
            recursiveAction2.fork();
            System.out.println("two end");
        }else{
            while(start<=end){
                System.out.print(itemList[start]+" ");
                start++;
            }
            System.out.println();
        }
    }
}
  1. 使用RecursiveTask有状态任务查分

注意一个点

使用 submit 和 future类来实现监控返回值状态

public class TestForkJoin {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ForkJoinPool forkJoinPool = new ForkJoinPool(8);
        MyRecursiveTask myRecursiveAction = new MyRecursiveTask(new int[] {
                1, 2, 3, 4, 5, 6, 7, 8, 9
        }, 0, 8);
        Future<Integer> item = forkJoinPool.submit(myRecursiveAction);
        System.out.println(item.get());
    }
}

class MyRecursiveTask extends RecursiveTask<Integer> {

    private int[] itemList;
    private int start;
    private int end;

    public MyRecursiveTask(int[] itemList, int start, int end) {
        this.itemList = itemList;
        this.start = start;
        this.end = end;
    }

    @Override
    protected Integer compute() {
        if(start==end){
            return itemList[start];
        }
        MyRecursiveTask left = new MyRecursiveTask(itemList,start,(start+end)/2);
        MyRecursiveTask right = new MyRecursiveTask(itemList,(start+end)/2+1,end);
        invokeAll(left,right);
        return left.join()+right.join();
    }
}

原理这里就不说了 , 主要是几个特性

  1. 自动的线程扩展

    • 很多线程池都有这种能力,通过监控cpu核心数量来创建线程数量
  2. 工作窃取

    • 空闲的线程去窃取其他工作线程队列中的任务 类似WorkStealingPool 多工作队列线程池
  3. 任务分片

    • forkjoin框架的核心
Image placeholder
Rosy
未设置
  57人点赞

没有讨论,发表一下自己的看法吧

推荐文章
Hyperf 框架使用 JWT 进行用户认证

配置上一篇文章中我们已经安装好phper666/jwt-auth组件,并发布了配置。配置文件config/autoload/jwt.php已经有详细配置说明,如果要改默认设置,只需要在.env文件中加

vue引入swiper vue使用swiper vue脚手架使用swiper /引入js文件/引入css文件

vue引入swipervue使用swipervue脚手架使用swiper/引入js文件/引入css文件欢迎加入前端交流群来获取视频资料以及前端学习资料:749539640转载文章请注明出处! 如果只是

S.O.L.I.D: PHP 面向对象设计的五个基准原则

S.O.L.I.D是首个5个面向对象设计(OOD)准则的首字母缩写,这些准则是由RobertC.Martin提出的,他更为人所熟知的名字是UncleBob。 这些准则使得开发出易扩展、可维护的软件变

施密特:谷歌的五大原则

大数据文摘出品作者:施密特在2013年的《致股东的公开信》中,谷歌创始人拉里·佩奇表示:“随着时间的推移,很多公司都习惯重复自己一贯的做法,只做出很少的渐进式的改变。假以时日,这样的渐进主义会导致落伍

​中台战略:业务中台的8个设计原则

业务中台是一个充满生命力的个体,它承载业务逻辑、沉淀业务数据、产生业务价值,并随着业务不断发展进化。它的设计遵循如下图所示的8个原则。业务中台设计的8大原则01 服务松耦合原则(1)面向接口实现这是服

Apache 的架构师们遵循的 30 条设计原则

本文作者叫Srinath,是一位科学家,软件架构师,也是一名在分布式系统上工作的程序员。 他是ApacheAxis2项目的联合创始人,也是ApacheSoftware基金会的成员。 他是WSO2流处理

敏捷开发流程之Scrum:3个角色、5个会议、12原则

本文主要从Scrum的定义和目的、敏捷宣言、Scrum中的人员角色、Scrum开发流程、敏捷的12原则等几方面帮助大家理解Scrum敏捷开发的全过程。一、Scrum的定义和目的Scrum是一个用于开发

workerman源码-workerman启动流程

前面我们跟着代码看了一遍workerman的初始化流程.但对于如何监听端口.等操作还没有具体的实现.我们这次就来看一下.workerman是如何监听端口并运行的.runAll在前面我们初始化方法过后,

elastic-job-lite 使用的一点心得和坑

elastic-job-lite开篇词 elastic-job-lite在项目中使用也有两个多月的时间了,从一开始搜索网上教程,参考别人使用方法,到后面阅读源码,理解其架构,实现。也写了几篇关于ej

Unix/Linux fork前传

课程推荐:Linux开发工程师--学习猿地精品课程 fork的由来 fork的思想在UNIX出现几年前就出现了,时间大概是1963年,这比UNIX在PDP-7上的第一个版本早了6年。 1963年,计算

Oculus CTO、传奇程序员John Carmack宣布离职:我要去搞AI了!

大数据文摘出品OculusCTO,也是游戏程序员大神、开源软件倡导者JohnCarmack昨天在Facebook上宣布,将辞去公司CTO职位,只担任咨询身份。而对于下一步的打算,John也毫不掩饰,直

Jenkins export and import jobs 迁移导出导入任务实践小结

前言我遇到的Jenkins迁移项目并非可以通过简单的物理文件复制就可以轻松解决,需要考虑上千个不同项目的jobs分离,Jenkins1.x和2.x大版本兼容性,JenkinsPlugins插件,Jen

js框架与css框架的区别?

js框架与css框架的区别?一、JavaScript框架●Javascript框架是指以Javascript语言为基础搭建的编程框架。●Javascript框架就是将常用的方法进行封装,方便调取使用。

PHP for和foreach的区别

推荐课程:PHP开发工程师--学习猿地精品在线课 首先,我们先准备两个用于遍历的数组: $arr1=array(1=>‘a‘,3=>22,5=>‘b‘,4=>‘c‘,8=>‘d‘); $arr2=ar

关于for丶foreach丶iterator 迭代器

课程推荐:Java开发工程师--学习猿地--送7个上线商业项目 1丶前言:我们在网上或者在讨论的时候往往会有这么一种说法:foreach也是迭代器的一类,底层实现的是迭代器。但是这种说法并不严谨,也可

使用 Workerman 做一个聊天室

为什么要写这篇文章? 我学习Workerman好几次了,每次都失败(没做成想要的功能,原谅我比较笨)。但是这次也花了好几个小时,把之前没做成的功能实现了。其实就是两个简单的功能:一对一发送消息,广

基于内存和文件存储的 queue worker, 不用 Redis 适合单进程使用没有外部依赖

因为最近要做一个简单的并发任务系统,在github上面找了一圈并没有简单可依赖的库,所以自己写了一个。欢迎大家Review贡献代码。项目地址https://github.com/iflamed/mfw

VIM教程_一些小技巧

简单设置Vim “工欲善其事,必先利其器”。尽管Vim非常强大,但默认配置的Vim看起来还是比较朴素的,为了适合我们的开发需求,要对Vim进行一些简单的配置。 :setnumber显示行号 :setr

保存并退出一些繁琐的文本编辑

执行部分编辑文件命令插入完成后保存并退出流程 已知命令: 并不是所有的,楼主碰到一个总结一个哈。 crontab-e gitconfig--global--edit gitcommit--amen

工程师笔记:我对数据库系统云原生化的一些思考

作者|张敏(于期)阿里云智能高级技术专家划重点我眼中的云原生我认为的云原生关键能力我眼中的云原生化技术手段我对数据库云原生化的思考伴随着云原生技术越来越热门,阿里内部关于CloudNative、Ser

《关于MySQL的一些骚操作》

概要回顾以前写的项目,发现在规范的时候,还是可以做点骚操作的。假使以后还有新的项目用到了MySQL,那么肯定是要实践一番的。为了准备,创建测试数据表(建表语句中默认使用utf8mb4以及utf8mb4

我在华为写了13年代码的一些感悟

一天晚上,我和老婆聊天,说部门要我写个“大咖谈软件”的文章,老婆斜了我一眼,淡淡地说:“Linus大神21岁就写出了Linux内核的雏形,缔造了一个自由主义的开源世界;张小龙28岁写出了foxmail

Vuex的一些常用知识点介绍

一、为什么要使用Vuex1、多个组件依赖同一个状态,使用组件之间通信方法会非常繁琐,例如多层嵌套组件。2、需要全局保存的数据,例如用户、权限信息,全局系统设置二、Vuex的五个核心属性1、state:

值得收藏的一些 CSS 属性选择器!

属性选择器非常神奇。它们可以使你摆脱棘手的问题,帮助你避免添加类,并指出代码中的一些问题。但是不要担心,虽然属性选择器非常复杂和强大,但是它们很容易学习和使用。在本文中,我们将讨论它们是如何运行的,并

一些JavaScript 类(class)中需要了解的知识

JavaScript使用原型继承:每个对象都从原型对象继承属性和方法。在Java或Swift等语言中使用的传统类作为创建对象的蓝图,在JavaScript中不存在,原型继承仅处理对象。原型继承可以模拟