将复杂的大任务拆分成多个简单的小任务进行计算

原创 2015年07月09日 16:10:55
package thread;


import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;
import java.util.concurrent.RecursiveTask;
/**
 * Fork/Join框架实现多线程计算<br/>
 * 计算1+2+3+4+...+99+100的总和<br/>
 * 因为本程序模拟的是最简单的计算,耗时极少,所以多线程计算还不如单线程计算快。<br/>
 * 但如果是比较耗时的复杂计算,多线程计算就快得多啦!
 * @author zhaoyujie
 *
 */
public class CountTask extends RecursiveTask<Integer> {


private static final long serialVersionUID = -4488036422261690638L;

private static final int THRESHOLD = 10;
private int start;
private int end;

public CountTask(int start, int end) {
this.start = start;
this.end = end;
}

@Override
protected Integer compute() {
int sum = 0;
//如果任务足够小就计算任务
boolean canCompute = (end-start)<=THRESHOLD;
if(canCompute){
for(int i=start; i<=end; i++){
sum += i;
}
}else{
//如果任务大于阀值,就分裂成两个子任务计算
int middle = (start+end)/2;
CountTask leftTask = new CountTask(start, middle);
CountTask rightTask = new CountTask(middle+1, end);
leftTask.fork();
rightTask.fork();
//等待子任务执行完,并得到其结果
int leftResult = leftTask.join();
int rightResult = rightTask.join();
sum = leftResult + rightResult;
}
return sum;
}

public static void main(String[] args) {
long currTime = System.currentTimeMillis();
ForkJoinPool forkJoinPool = new ForkJoinPool();
CountTask task = new CountTask(1, 100);
Future<Integer> future = forkJoinPool.submit(task);
try {
System.out.println(future.get());
System.out.println("用时毫秒数:"+(System.currentTimeMillis()-currTime));
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}


}

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

概要 现代的计算机已经向多CPU方向发展,即使是普通的PC,甚至现在的智能手机、多核处理器已被广泛应用。在未来,处理器的核心数将会发展的越来越多。 虽然硬件上的多核CPU已经十分成熟,但是很多...
  • conquer0715
  • conquer0715
  • 2016-04-29 15:56:52
  • 4287

利用FutureTask和ExecutorService实现一个任务拆分成多个任务,实现性能提高

在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。   这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。   如果...
  • czp11210
  • czp11210
  • 2016-05-19 00:26:01
  • 1168

Java 多线程中的任务分解机制-ForkJoinPool详解

一、任务分解问题和ForkJoinPool简介        在多线程并发编程中,有时候会遇到将大任务分解成小任务再并发执行的场景。Java 8新增的ForkJoinPool很好的支持了这个问题。  ...
  • a369414641
  • a369414641
  • 2015-09-10 21:51:37
  • 2689

分解和合并:Java 也擅长轻松的并行编程!

本文讨论了 Java 并发编程,重点强调 Java SE 7 为简化并行程序编写而提供的新的分解/合并任务。本文显示,可以使用和组合丰富的基元来编写可利用多核处理器的高性能程序,而完全无需处理线程和共...
  • zl1zl2zl3
  • zl1zl2zl3
  • 2017-02-08 16:50:33
  • 649

java List(分割)分批处理

转载自:http://www.cnblogs.com/java666/p/4789597.html public static void main(List dataList) { ...
  • Miss_kun
  • Miss_kun
  • 2016-05-26 15:00:39
  • 5540

E-Learning团队的岗位职责分工

E-Learning团队的岗位职责分工(转载) 分类:e-learning相关R & R for elearning最近一段时间brandonhall yahoo新闻组讨论的一个话题,是E-Learn...
  • xfworld
  • xfworld
  • 2007-11-26 16:13:00
  • 1485

“WORD 电子小报”<em>教学设计</em>

本文主要从五个方面具体阐述了<em>任务</em>驱动法的电子小报<em>教学设计</em>,即<em>任务</em>驱动法教学...其中<em>任务</em>驱动法的教学应用是其中的重点,以<em>分解</em>的四个子<em>任务</em>为其教学过程的核心...
  • 2018年04月13日 00:00

java大数组拆分多个小数组

这几天用到不少小东西,先放到博客吧 import java.util.Random; publicclass cdsc {        public String excute(int len...
  • s1242413556
  • s1242413556
  • 2014-11-14 10:47:36
  • 703

根据目录将含有多个Sheet的Excel拆分成多个Excel

原谅我的表述能力有限,刚接到这个小活的时候,我以为很简单,但当我打开那个含有300+sheet页的excel表格时,我开始慌了。这300多个sheet中其中有30多个目录页,我的工作就是根据这30多个...
  • qq_36643627
  • qq_36643627
  • 2017-10-13 16:29:06
  • 398

《顺序结构的程序设计》教学设计

(一)教材分析   教育科学出版社《算法与程序设计》(选修)模块第二章第三节《程序的基本结构》一共三课,本课选用的是第一小节《顺序结构》。众所周知,无论多么复杂的程序都可以分解为顺序、选择、循环这三...
  • learn_2
  • learn_2
  • 2011-09-16 10:10:59
  • 5502
收藏助手
不良信息举报
您举报文章:将复杂的大任务拆分成多个简单的小任务进行计算
举报原因:
原因补充:

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