今天在看jdk1.7的forkjoin框架时候,里面有个例子如下:

product类:

public class Product {

    private String name;

    private double price;

    public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public double getPrice() {
return price;
} public void setPrice(double price) {
this.price = price;
}
}
ProductListGenerator类:
public class ProductListGenerator {

    public List<Product> generate(int size){
List<Product> ret= new ArrayList<>();
for (int i = 0; i<size;i++){
Product product = new Product();
product.setName("product" + i);
product.setPrice(10);
ret.add(product);
}
return ret;
}
}

Task类:

public class Task  extends RecursiveAction {

    private int first;

    private int last;

    private double increment;

    private List<Product> productList;

    public  Task(int first, int last, double increment, List<Product> productList) {
this.first = first;
this.last = last;
this.increment = increment;
this.productList = productList;
} @Override
protected void compute() { if (last - first <9){
updatePrices(); }else {
int middle = (last+first)/2; //System.out.printf("Task:Pending tasks:%s\n",getQueuedTaskCount()); Task t1 = new Task(first,middle+1,increment,productList); Task t2 = new Task(middle+1,last,increment,productList);
invokeAll(t1,t2);
}
} private void updatePrices(){
for(int i = first;i<last;i++){
Product product = productList.get(i);
product.setPrice(product.getPrice()*(1+increment));
}
} }

main方法:

public class Main {

    public static void main(String[] args) {
ProductListGenerator generator = new ProductListGenerator();
Long startTime = System.currentTimeMillis();
List<Product> products = generator.generate(10000000);
Task task = new Task(0,products.size(),0.20,products); ForkJoinPool forkJoinPool = new ForkJoinPool();
forkJoinPool.execute(task); do {
System.out.printf("Main:Thread count:%d\n",forkJoinPool.getActiveThreadCount());
System.out.printf("Main:Thread steal:%d\n",forkJoinPool.getStealCount());
System.out.printf("Main:Parallelism:%d\n",forkJoinPool.getParallelism());
try {
// TimeUnit.MILLISECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}while (!task.isDone()); System.out.println("========");
forkJoinPool.shutdown(); long endTime = System.currentTimeMillis();
long time = endTime-startTime;
System.out.println("在内存中运算时间:" + time + "毫秒"); if (task.isCompletedNormally()){
System.out.printf("Main:The proccess has completed normally.\n");
} for (int i =0;i<products.size();i++){
Product product = products.get(i);
if(product.getPrice() != 12){
System.out.printf("Product %s : %f\n",product.getName(),product.getPrice());
}
} System.out.printf("Main:End of the program. \n");
} }

这样是没问题的,1千万条数据运行大概需要15000多毫秒.然而自己实现,不用实现RecursiveAction的话只要5000毫秒左右:代码

long starT1 = System.currentTimeMillis();

            List<Product> list = new ArrayList<>();
for(int i =0;i<10000000;i++){
Product product = new Product();
product.setName("product" + i);
product.setPrice(10);
list.add(product);
} for(int i = 0;i<list.size();i++){
Product product = list.get(i);
product.setPrice(product.getPrice()*(1+0.2));
} long endTimeT2 =System.currentTimeMillis();
long t = endTimeT2 -starT1;
System.out.println("单线程1000万数据时间:" + t + "毫秒");

就有点不明白了,就算是因为在task里面有构造方法以及因为判断影响,但是这样多线程是为了什么那? 还有 我把ArrayList修改为Actor,这样也是差不多的结果。。。 没明白fork/join框架的devide方法 究竟有什么好处?

后来明白了:demo里面的 属于计算密集型,线程数目应该适当小些。因为有线程的来回切换,导致时间比单线程要慢些,如果在单线程加上休眠1毫秒,会发现那个速度特别慢了;而如果是IO密集型,比如读取文件、数据库连接、网络通讯,线程数适当大些。

forkjoin框架疑问记录的更多相关文章

  1. Java并发包线程池之ForkJoinPool即ForkJoin框架(一)

    前言 这是Java并发包提供的最后一个线程池实现,也是最复杂的一个线程池.针对这一部分的代码太复杂,由于目前理解有限,只做简单介绍.通常大家说的Fork/Join框架其实就是指由ForkJoinPoo ...

  2. ForkJoin框架

    1. 什么是Fork/Join框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架. 我们再通过 ...

  3. java fork-join框架应用和分析

    http://shmilyaw-hotmail-com.iteye.com/blog/1897636 java fork-join框架应用和分析 博客分类: concurrency multithre ...

  4. Java并发编程原理与实战三十二:ForkJoin框架详解

    1.Fork/Join框架有什么用呢? ------->Fork使用来切分任务,Join是用来汇总结果.举个简单的栗子:任务是1+2+3+...+100这个任务(当然这个任务的结果有好的算法去做 ...

  5. Java7 Fork-Join 框架:任务切分,并行处理

    概要 现代的计算机已经向多CPU方向发展,即使是普通的PC,甚至现在的智能手机.多核处理器已被广泛应用.在未来,处理器的核心数将会发展的越来越多.虽然硬件上的多核CPU已经十分成熟,但是很多应用程序并 ...

  6. Java--8--新特性--串并行流与ForkJoin框架

    并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流.穿行流则相反,并行流的底层其实就是ForkJoin框架的一个实现. 那么先了解一下ForkJoin框架吧. Fork/Join ...

  7. 4.VUE前端框架学习记录四:Vue组件化编码2

    VUE前端框架学习记录四:Vue组件化编码2文字信息没办法描述清楚,主要看编码Demo里面,有附带完整的代码下载地址,有需要的同学到脑图里面自取.脑图地址http://naotu.baidu.com/ ...

  8. 3.VUE前端框架学习记录三:Vue组件化编码1

    VUE前端框架学习记录三:Vue组件化编码1文字信息没办法描述清楚,主要看编码Demo里面,有附带完整的代码下载地址,有需要的同学到脑图里面自取.脑图地址http://naotu.baidu.com/ ...

  9. 2.VUE前端框架学习记录二

    VUE前端框架学习记录二:Vue核心基础2(完结)文字信息没办法描述清楚,主要看编码实战里面,有附带有一个完整可用的Html页面,有需要的同学到脑图里面自取.脑图地址http://naotu.baid ...

随机推荐

  1. Iviews视频搜索引擎

    随着视频类型的增加和数据量的日益庞大,如何有效地组织和管理这些数据,使人们能够方便地从大量视频数据中找到自己感兴趣的相关视频片段已成为一种迫切的需求,而能够满足这一需求的技术便是目前人们普遍关注的基于 ...

  2. 【Kafka】Kafka集群搭建

    一.准备工作 服务器:最好是多台,大于等于2 已经搭建好的zookeeper集群 下载软件kafka_2.11-0.10.0.1.tgz 二.创建目录 #创建目录 cd /opt/ mkdir kaf ...

  3. 如何为 Go 设计一个通用的日志包

    需求 一个通用的日志包,应该满足以下几个需求: 兼容 log.Logger,标准库大量使用了 log.Logger 作为其错误内容的输出通道,比如 net/http.Server.ErrorLog,所 ...

  4. Eclipse下搭建Django环境

    1.打开Eclipse,在Help->Install New Software,输入上诉信息,然后点击下一步(因这里已经安装了,所以无法点击下一步) 2.安装完成以后,进入Windows-> ...

  5. java的IO流,字节流和字符流

    java操作文件都是通过流来处理的,(其实其他很多语言也是这样) 第一:java的IO流,分为:输入流 和 输出流(这真是废话,这是从流向的角度来说的) 第二:java的所有IO流,只分为:字节流 和 ...

  6. 开始使用 Vuejs 2.0 ---简单总结1

    Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vuejs 采用自底向上增量开发的设计.Vuejs 的核心库只关注视图层,并且非常容 ...

  7. iOS开源项目周报0209

    由OpenDigg 出品的iOS开源项目周报第七期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等.Hedwig 向 ...

  8. [转]wxParse-微信小程序富文本解析组件

    本文转自:https://github.com/icindy/wxParse 基本使用方法 Copy文件夹wxParse - wxParse/ -wxParse.js(必须存在) -html2json ...

  9. C# 之VS程序打包

    VS2012没有自带打包工具,所以要先下载并安装一个打包工具.我采用微软提供的打包工具:  InstallShield2015LimitedEdition.下载地址:http://pan.baidu. ...

  10. android studio 中由于网络问题,编译错误

    由于网络原因,需要连外网实现下载相关依赖包,导致编译失败 在 build.gradle文件中 将原来是jcenter()的地址改成 maven{ url 'http://maven.aliyun.co ...