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提高业务代码处理性能的更多相关文章

  1. 如何使用 Set 来提高JS代码的性能

    摘要: 高效使用Set! 作者:前端小智 原文:如何使用 Set 来提高代码的性能 Fundebug经授权转载,版权归原作者所有. 为了保证的可读性,本文采用意译而非直译. 我确信有很多开发人员坚持使 ...

  2. php 高级 提高PHP代码的性能10条建议

    1.echo比print要快很多.两个方法都会在页面上打印东西,不过echo不返回任何值,print会在成功或失败的时候返回0或1. 2.include_once比include更加耗时.因为它需要去 ...

  3. ☕【Java技术指南】「并发编程专题」Fork/Join框架基本使用和原理探究(基础篇)

    前提概述 Java 7开始引入了一种新的Fork/Join线程池,它可以执行一种特殊的任务:把一个大任务拆成多个小任务并行执行. 我们举个例子:如果要计算一个超大数组的和,最简单的做法是用一个循环在一 ...

  4. java Fork/Join框架

    应用程序并行计算遇到的问题 当硬件处理能力不能按摩尔定律垂直发展的时候,选择了水平发展.多核处理器已广泛应用,未来处理器的核心数将进一步发布,甚至达到上百上千的数量.而现在很多的应用程序在运行在多核心 ...

  5. JDK1.7之Fork/join

    Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架.Fork/Join框架要完成两件事情: 1.任务分 ...

  6. Java并发——Fork/Join框架

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/4631466. ...

  7. Java Fork/Join 框架

    简介 从JDK1.7开始,Java提供Fork/Join框架用于并行执行任务,它的思想就是讲一个大任务分割成若干小任务,最终汇总每个小任务的结果得到这个大任务的结果. 这种思想和MapReduce很像 ...

  8. jdk7 并行计算框架Fork/Join

    故名思义,拆分fork+合并join.jdk1.7整合Fork/Join,性能上有大大提升. 思想:充分利用多核CPU把计算拆分成多个子任务,并行计算,提高CPU利用率大大减少运算时间.有点像,Map ...

  9. Java并发——Fork/Join框架与ForkJoinPool

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/4631466. ...

随机推荐

  1. toPlainString() 和 toString()(转载)

    函数 toPlainString() 和 toString() 对于 BigDecimal b ; (b=(0.4321)^ 20) String s = b.toPlainString() ; Sy ...

  2. 关于阿里云ecs服务器无法用FTP进行连接问题

    背景 前两天趁机老马又搞优惠,就又撸了一台三年的ecs来折腾,后来整了半天发现ftp怎么都连接不上,以前也是撸过阿里的服务器,不过启动盘是巨硬家的系统, 最后发现虽然服务器的防火墙关了,但是老马为了安 ...

  3. crm系统和e_store商场的比较总结

    e_store用了:Java.Servlet.JSP.Oracle.JQuery.Mybatis,tomcat技术 crm用了 :Java.JSP.Oracle.JQuery,Mybatis,spri ...

  4. Servlet 学习(八)

    Filter 1.功能 Java Servlet 2.3 中新增加的功能,主要作用是对Servlet 容器的请求和响应进行检查和修改 Filter 本身并不生成请求和响应对象,它只提供过滤作用 在Se ...

  5. Caffe2 创建你的专属数据集(Create Your Own Dataset)[9]

    这一节尝试把你的数据转换成caffe2能够使用的形式.这个教程使用Iris的数据集.你可以点击这里查看Ipython Notebook教程. DB数据格式 Caffe2使用二进制的DB格式来保存数据. ...

  6. Linux centosVMware 自动化运维Ansible介绍、Ansible安装、远程执行命令、拷贝文件或者目录、远程执行脚本、管理任务计划、安装rpm包/管理服务、 playbook的使用、 playbook中的循环、 playbook中的条件判断、 playbook中的handlers、playbook实战-nginx安装、管理配置文件

    一.Ansible介绍 不需要安装客户端,通过sshd去通信 基于模块工作,模块可以由任何语言开发 不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读 安装十分简单,ce ...

  7. Windows的本地时间(LocalTime)、系统时间(SystemTime)、格林威治时间(UTC-Time)、文件时间(FileTime)之间的转换

    今天处理了一个Bug,创建历史数据时脚本函数的起始时间不赋值或者赋0值时,计算引擎推给历史库的UTC时间为-288000000000,一开始以为是bug,经过分析后发现不赋值默认给起始时间赋0值,而此 ...

  8. HIHOcoder编程总结

    [Offer收割]编程练习赛44 对于第一题题目1 : 扫雷游戏,首先要想清楚思路,虽然是暴力算法,但是这八个方向要自己把坐标写正确,不要慌乱,自己写的时候就写错了一个,第二个就是判断的时候,j + ...

  9. 解决 U2000 R017 安装报错: 检查SQL server数据库环境变量信息 ( 异常 ) [ 详细信息 ] PATH环境变量中缺少数据库路径的信息

    U2000 R017 安装报错: 检查SQL server数据库环境变量信息 ( 异常 ) [ 详细信息 ] PATH环境变量中缺少数据库路径的信息 管理员模式打开注册表位置: HKEY_LOCAL_ ...

  10. C语言中的结构体是怎么定义的_怎么使用?

    结构体的定义 // 定义结构体st struct st{ int a; // 成员a int b; // 成员b }; #include <stdio.h> struct st{ int ...