java线程_ 任务分解工具fork_join实现并行计算

转载 2012年03月28日 15:02:46

java线程_ 任务分解工具fork_join实现并行计算

2011年12月29日 共有137次浏览

  本文是java并发编程之线程系列的第十八篇。介绍了任务分解工具fork_join,可实现并行计算。fork/join的处理方法,将问题递归的分成多个子问题,直到每个子问题足够的小,能够高效率的串行的处理。递归的过程,就是把问题分成两个或者更多的子问题,然后把这些问题放入队列里(fork步骤),然后等待所有子问题的结果(join步骤),最终把所有的结果合并在一起。另外需要注意的是fork/join 是jdk 1.7版本下的并发包。

1、编写一个CalcTask.java。

 package cn.howsky.task;
   
 import java.util.concurrent.RecursiveTask;
   
 public class CalcTask extends RecursiveTask<Integer> {
   
  private static final int threshold = 100;
  private int fromIndex;
  private int toIndex;
   
  public CalcTask(int fromIndex, int toIndex) {
   this.fromIndex = fromIndex;
   this.toIndex = toIndex;
  }
   
  /**
   * jzh add 2011-12-29
   */
  @Override
  protected Integer compute() {
   int total = 0;
   if ((toIndex - fromIndex) < threshold) {
    for (int i = fromIndex; i <= toIndex; i++) {
     total += i;
    }
   } else {
    int middle = (fromIndex + toIndex) / 2;
    CalcTask leftTask = new CalcTask(fromIndex, middle);
    CalcTask rightTask = new CalcTask(middle + 1, toIndex);
    // 任务分解
    leftTask.fork();
    rightTask.fork();
   
    // 合并各个子任务的结果
    total = leftTask.join() + rightTask.join();
   }
   return total;
  }
   
 }

2、编写测试CalcTest.java。

 package cn.howsky.task;
   
 import java.util.concurrent.ForkJoinPool;
 import java.util.concurrent.Future;
   
 public class CalcTest {
   
  /**
   * @author jzh add 2011-12-29
   * @param args
   */
  public static void main(String[] args) throws Exception {
   ForkJoinPool forkJoinPool = new ForkJoinPool();
   // 递交任务,获取返回结果
   Future<Integer> future = forkJoinPool.submit(new CalcTask(0, 1000));
   System.out.println(future.get());
 }

3、执行结果很简单,就是输出结果集500500。如果测试机器是多cpu的可以把数值搞的大点,比如N亿次,性能才能发挥出来,普通的机器,用fork/join,数值一大,机器就卡住。

关于并发的相关文章(concurrency)。

相关文章推荐

JAVA Metrics 度量工具使用介绍1

Java Metric使用介绍1 Metrics是一个给JAVA提供度量工具的包,在JAVA代码中嵌入Metrics代码,可以方便的对业务代码的各个指标进行监控,同时,Metrics能够很好的跟Ga...

java nio 和 jvm 虚拟机参数的 XX:+DisableExplicitGC 的潜规则

有段时间应用总是出现jvm所管理的内存没有发生溢出的情况,而是使用的直接内存区域发生溢出的行为。后来经过分析情况如下: 是由于应用中使用netty,netty 使用的nio 和 jvm 中的 XX:...
  • phj88
  • phj88
  • 2012-09-24 10:38
  • 7061

Tomcat内存优化3 java内存泄漏的定位与分析

1、为什么会发生内存泄漏 java 如何检测内在泄漏呢?我们需要一些工具进行检测,并发现内存泄漏问题,不然很容易发生down机问题。 编写java程序最为方便的地方就是我们不需要管理内存的...

jvm系列五:使用JMAP dump及分析dump文件

分析JAVA Application的内存使用时,jmap是一个很实用的轻量级工具。使用jmap可以查看heap空间的概要情况,粗略的掌握heap的使用情况。也可以生成heapdump文件,再使用jh...

jmap命令(Java Memory Map)

JDK内置工具使用 一、javah命令(C Header and Stub File Generator) 二、jps命令(Java Virtual Machine Process Status To...

Java内存Dump文件查看和分析工具介绍

1.IBM Memory Analyzer 1)下载地址: https://www6.software.ibm.com/sdfdl/1v2/regs2/awadmin/heapanalyzer/X...

jstat命令(Java Virtual Machine Statistics Monitoring Tool)

JDK内置工具使用 一、javah命令(C Header and Stub File Generator) 二、jps命令(Java Virtual Machine Process Status To...

jps命令(Java Virtual Machine Process Status Tool)

JDK内置工具使用 一、javah命令(C Header and Stub File Generator) 二、jps命令(Java Virtual Machine Process Status To...

jhat命令

jhat命令 -- Java Head Analyse Tool 用途:是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言 第一步:...

MAT(Memory Analyzer Tool)工具入门介绍

1、MAT是什么?     MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)