zoukankan      html  css  js  c++  java
  • 浅谈 Fork/Join

    fork/join的java7新添加的功能,能够把它理解成一个并发框架。

    我们通过fork/join能将一个可分解的大任务。分解成多个子任务同步运行。运行完成后,在将各子任务的结果进行合并,得到终于的结果。

    使用fork/join,首先要创建fork/join任务。能够通过继承RecursiveActionRecursiveTask来实现(ForkJoinTask是它们的父类)

    • RecursiveAction 不返回结果
    • RecursiveTask 返回结果

    经常用法

    • compute(); 计算方法(分拆的子任务)
    • fork(); // 运行子任务
    • join(); // 子任务结束后返回相应结果

    ForkJoinPool
    除此之外。java还提供了个ForkJoinPool的工具类。它实现了工作窃取算法,使得空暇线程能够主动分担从别的线程分解出来的子任务。从而让全部的线程都尽可能处于饱满的工作状态。提高运行效率。

    经常用法

    • execute(); //异步运行命令
    • invoke()和invokeAll(); // 异步运行命令。并返回相应结果
    • submit(); //异步运行命令,同一时候返回Future对象

    使用方式例如以下

    class Demo extends java.util.concurrent.RecursiveTask<Integer>{
        int start;
        int end;
    
        public Demo(int start,int end){
            this.start=start;
            this.end=end;
        }
    
        @Override
        protected Integer compute() {
            int sum=0;
            int s=start;
            int e=end;
            for(;s<=end;s++){
                sum+=s;
            }
            return sum;
        }
    }
    
    @Test
    public void test2(){
        //1到1亿。相加等于几   0.37
        Demo demo1=new Demo(1,50000000);
        Demo demo2=new Demo(50000001,100000000);
        demo1.fork();
        demo2.fork();
        System.out.println(demo1.join()+demo2.join());
    }
    
    @Test
    public void test3(){
        ForkJoinPool fjp=new ForkJoinPool();
        Demo demo1=new Demo(1,50000000);
        Demo demo2=new Demo(50000001,100000000);
        System.out.println(fjp.invoke(demo1)+fjp.invoke(demo2));
    }
  • 相关阅读:
    DP 训练题目
    洛谷 P1736 创意吃鱼法
    树形背包
    树形DP
    轻松完爆Helm私有仓库
    轻松完爆Helm公共仓库
    一分钟轻松玩转Helm
    ceph -s 出现 mon is allowing insecure global_id reclaim
    Django下载与简介
    部署ceph集群 (Nautilus版)
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7229688.html
Copyright © 2011-2022 走看看