jdk1.7推出的Fork/Join提高业务代码处理性能
jdk1.7推出的Fork/Join提高业务代码处理性能
jdk1.7之后推出了Fork/Join框架,其原理个人理解为:递归多线程并发处理业务代码,以下为我模拟我们公司业务代码做的一个案例,性能可提升75%:
**下边这个类是模拟现有业务代码写的**
package NoForkJoin;
import forkJoinTest.Row;
import forkJoinTest.Student;
import java.util.ArrayList;
import java.util.List;
/**
 * @author liu_l
 * @Title: ServiceImp
 * @ProjectName workspace-idea
 * @Description: TODO
 * @date 2018/6/240:32
 */
public class ServiceImp {
    public static void main(String[] args) throws InterruptedException {
        long s0 = System.currentTimeMillis();
        //造业务数据
        List<Student> list = new ArrayList<Student>();
        for (int i = 0; i < 10000; i++) {
            Student student = new Student();
            student.setName("test1" + i);
            student.setSax("man");
            student.setTall((double) i);
            list.add(student);
        }
        //开始业务数据处理
        List<Row> rows = new ArrayList<Row>();
        for (int i = 0; i < 10000; i++) {
            Student student = list.get(i);
            //模拟一条业务数据处理需耗时1毫秒
            Thread.sleep(1);
            Row row = new Row();
            row.put("name", student.getName());
            row.put("sax", student.getSax());
            row.put("tall", student.getTall());
            rows.add(row);
        }
        System.out.println("共处理业务对象:" + rows.size() + "个");
        System.out.println("共耗时:" + (System.currentTimeMillis() - s0) + "毫秒");
    }
}
运行结果如图:  
下面为采用fork/join框架来实现此功能:
student类:模拟业务对像
        package forkJoinTest;
        import java.io.Serializable;
        /**
         * @author liu_l
         * @Title: Student
         * @ProjectName workspace-idea
         * @Description: TODO
         * @date 2018/6/2323:03
         */
        public class Student implements Serializable {
            private String name;
            private Double tall;
            private String sax;
            public String getName() {
                return name;
            }
            public void setName(String name) {
                this.name = name;
            }
            public Double getTall() {
                return tall;
            }
            public void setTall(Double tall) {
                this.tall = tall;
            }
            public String getSax() {
                return sax;
            }
            public void setSax(String sax) {
                this.sax = sax;
            }
        }
rows继承与HashMap,将业务对象组装为map格式:
        package forkJoinTest;
        import java.util.ArrayList;
        import java.util.concurrent.ConcurrentHashMap;
        /**
         * @author liu_l
         * @Title: Row
         * @ProjectName workspace-idea
         * @Description: TODO
         * @date 2018/6/2323:06
         */
        public class Row extends ConcurrentHashMap{
            public Student Student;
        }
**重点:Fork/Join框架处理业务代码:**
        package forkJoinTest;
        import java.util.ArrayList;
        import java.util.List;
        import java.util.concurrent.RecursiveTask;
        /**
         * @author liu_l
         * @Title: ForkJoin
         * @ProjectName workspace-idea
         * @Description: TODO
         * @date 2018/6/2323:09
         */
        public class ForkJoinCode extends RecursiveTask<List<Row>>{
            protected static int THREAD_HOLD = 50;
            protected int start;//开始任务序号
            protected int end;//结束任务序号
            protected List<Student> datas;
            /**
             * @Description: TODO
             * @param:
             * @author liu-lei
             * @date 2018/6/23 23:19
             */
            public static ForkJoinCode getInstance(int start, int end, List<Student> datas){
                ForkJoinCode forkJoinCode = new ForkJoinCode();
                forkJoinCode.start = start;
                forkJoinCode.end = end;
                forkJoinCode.datas = datas;
                return forkJoinCode;
            }
            @Override
            protected List<Row> compute() {
                List<Row> rows = new ArrayList<Row>();
                boolean canCompute = (end - start) <= THREAD_HOLD;
                if(canCompute){
                    for(int i = start; i <= end; i++){
                        tranfromT2Row(rows, i);
                    }
                }else{
                    int middle = (start + end)/2;
                    ForkJoinCode leftForkJoin = ForkJoinCode.getInstance(start, middle, datas);
                    ForkJoinCode rightForkJoin = ForkJoinCode.getInstance(middle+1, end, datas);
                    leftForkJoin.fork();
                    rightForkJoin.fork();
                    List<Row> lResult = leftForkJoin.join();
                    List<Row> rResult = rightForkJoin.join();
                    rows.addAll(lResult);
                    rows.addAll(rResult);
                }
                return rows;
            }
            /**
             * @Description: 业务代码处理
             * @param:
             * @author liu-lei
             * @date 2018/6/24 0:33
             */
            public void tranfromT2Row(List<Row> rows, int i){
                Student student = datas.get(i);
                Row row = new Row();
                row.put("name", student.getName());
                row.put("sax", student.getSax());
                row.put("tall", student.getTall());
                try {
                    //模拟业务数据处理需耗时5毫秒
                    Thread.sleep(3);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                rows.add(row);
            };
Service方法进行调用:
        package forkJoinTest;
        import java.util.ArrayList;
        import java.util.List;
        import java.util.concurrent.ExecutionException;
        import java.util.concurrent.ForkJoinPool;
        import java.util.concurrent.Future;
        /**
         * @author liu_l
         * @Title: ServiceImp
         * @ProjectName workspace-idea
         * @Description: TODO
         * @date 2018/6/240:12
         */
        public class ServiceImp {
            public static void main(String[] args) throws ExecutionException, InterruptedException {
                long s0 = System.currentTimeMillis();
                //造业务数据
                List<Student> list = new ArrayList<Student>();
                for(int i = 0; i < 10000; i ++){
                    Student student = new Student();
                    student.setName("test1" + i);
                    student.setSax("man");
                    student.setTall((double)i);
                    list.add(student);
                }
                //开始业务数据处理
                ForkJoinPool pool = new ForkJoinPool();
                ForkJoinCode studentForkJoinCode = ForkJoinCode.getInstance(0, list.size()-1, list);
                Future<List<Row>> result = pool.submit(studentForkJoinCode);
                System.out.println("共处理业务对象:" + result.get().size() + "个");
                showPoolStates(pool);
                System.out.println("共耗时:" + (System.currentTimeMillis() - s0) + "毫秒");
            }
            /**
             * @Description: 监控Fork/Join池相关方法
             * @param:
             * @author liu-lei
             * @date 2018/6/24 0:43
             */
            private  static  void showPoolStates(ForkJoinPool pool){
                System.out.println("*******************");
                System.out.println("线程池的worker线程数量:" + pool.getPoolSize());
                System.out.println("当前执行任务的线程数量:" + pool.getActiveThreadCount());
                System.out.println("没有被阻塞正在工作的线程:" + pool.getRunningThreadCount());
                System.out.println("已经提交给池还没有开始执行的任务数:" + pool.getQueuedSubmissionCount());
                System.out.println("已经提交给池开始执行的任务数:" + pool.getQueuedTaskCount());
                System.out.println("线程偷取任务数:" + pool.getStealCount());
            }
        }
测试结果如下: 
讲个结果对比性能提升了63%: 
jdk1.7推出的Fork/Join提高业务代码处理性能的更多相关文章
- 如何使用 Set 来提高JS代码的性能
		
摘要: 高效使用Set! 作者:前端小智 原文:如何使用 Set 来提高代码的性能 Fundebug经授权转载,版权归原作者所有. 为了保证的可读性,本文采用意译而非直译. 我确信有很多开发人员坚持使 ...
 - php 高级 提高PHP代码的性能10条建议
		
1.echo比print要快很多.两个方法都会在页面上打印东西,不过echo不返回任何值,print会在成功或失败的时候返回0或1. 2.include_once比include更加耗时.因为它需要去 ...
 - ☕【Java技术指南】「并发编程专题」Fork/Join框架基本使用和原理探究(基础篇)
		
前提概述 Java 7开始引入了一种新的Fork/Join线程池,它可以执行一种特殊的任务:把一个大任务拆成多个小任务并行执行. 我们举个例子:如果要计算一个超大数组的和,最简单的做法是用一个循环在一 ...
 - java Fork/Join框架
		
应用程序并行计算遇到的问题 当硬件处理能力不能按摩尔定律垂直发展的时候,选择了水平发展.多核处理器已广泛应用,未来处理器的核心数将进一步发布,甚至达到上百上千的数量.而现在很多的应用程序在运行在多核心 ...
 - JDK1.7之Fork/join
		
Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架.Fork/Join框架要完成两件事情: 1.任务分 ...
 - Java并发——Fork/Join框架
		
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/4631466. ...
 - Java Fork/Join 框架
		
简介 从JDK1.7开始,Java提供Fork/Join框架用于并行执行任务,它的思想就是讲一个大任务分割成若干小任务,最终汇总每个小任务的结果得到这个大任务的结果. 这种思想和MapReduce很像 ...
 - jdk7 并行计算框架Fork/Join
		
故名思义,拆分fork+合并join.jdk1.7整合Fork/Join,性能上有大大提升. 思想:充分利用多核CPU把计算拆分成多个子任务,并行计算,提高CPU利用率大大减少运算时间.有点像,Map ...
 - Java并发——Fork/Join框架与ForkJoinPool
		
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/4631466. ...
 
随机推荐
- 大盘及策略收益率的公式推导与Python代码
			
一.模型前提与假设 设策略总天数为\(n\).第\(t\)日大盘的收盘价为\(P_t\).第\(t\)日的单日收益率为\(r_t\).\(n\)天的累积收益率为\(r_{cum}\) 假设策略仅买卖大 ...
 - python中的异常处理:厌而不舍
			
什么是异常? ------异常:不正常的情况 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行.一般情况下,在Python无法正常处理程序时就会发生一个异常. 异常是Pytho ...
 - Primecoin在windows上的部署和启动服务
			
Primecoin在windows上的部署和启动服务: 一.从官方获得Primecoin的windows版安装包: 二.一路像安装客户端一样的安装: 三.安装成功后它会自动弹出客户端运行,同步数据, ...
 - ARM CORTEX-M3 内核架构理解归纳
			
ARM CORTEX-M3 内核架构理解归纳 来源:网络 个人觉得对CM3架构归纳的非常不错,因此转载 基于<ARM-CORTEX M3 权威指南>做学习总结: 在我看来,Cotex-M3 ...
 - 无root开热点教程
			
本教程适用于无root类开热点,理论上动态云免等均可使用 热点成功测试方法与免流测试方法相同,一般都为查看ip所在地区 热点端 1.打开个人热点 2.如果是tinyproxy可打开右上角菜单,点击热点 ...
 - Linux系统下安装python3.7.3环境
			
这里用到的Linux系统是centos7系统,centos7是自带py的但是py的2.7.5版本 连接服务器的使用的是SSH Secure shell 1.首先安装依赖包 1)安装gcc编译器 gcc ...
 - 图片切换.----so屌
			
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - SpringBoot 处理异常的几种常见姿势
			
SpringBoot 处理异常的几种常见姿势 1. 使用 @ControllerAdvice 和 @ExceptionHandler 处理全局异常 这是目前很常用的一种方式,非常推荐.测试代码中用到了 ...
 - Idea牛逼插件,拿走不谢
			
1.grep console java 开发的过程中,日志都会输出到console,输出的内容是非常多的,所以需要有一个工具可以方便的查找日志,或者可以非常明显显示我们关注的内容,grep conso ...
 - 137、Java内部类之把内部类放到外部
			
01.代码如下: package TIANPAN; class Outer { // 外部类 private String msg = "Hello World !"; publi ...