Fork/Join

Java7提供了Fork/Join来支持将一个任务拆分成多个“小任务”并行计算,再把多个“小任务”的结果合并成总的计算结果。

类图

Java7提供了ForkJoinPool来支持将一个任务拆分为多个小任务并行计算,再把多个小任务的结果合并成总的计算结果。ForkJoinPool是ExecutorService的实现类,因此是一种特殊的线程池。
ForkJoinPool(int n)创建一个包含n个并行线程的ForkJoinPool
ForkJoinPool()创建一个Runtime.availableProcessors()返回值个数的并行线程。
ForkJoinTask代表一个可以并行、合并的任务,是一个抽象类,它还有两个抽象子类:RecursiveAction和RecursiveTask。其中RecursiveTask代表有返回值的任务,而RecursiveAction代表没有返回值的任务。

RecursiveAction实例:

package org.github.lujiango;  

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
import java.util.concurrent.TimeUnit; class PrintTask extends RecursiveAction {
private static final long serialVersionUID = 1L;
private static final int threshold = 50;
private int start;
private int end; public PrintTask(int start, int end) {
this.start = start;
this.end = end;
} @Override
protected void compute() {
if (end - start < threshold) {
for (int i = start; i < end; i++) {
System.out.println(Thread.currentThread().getName() + " i: " + i);
}
} else {
int middle = (start + end) / 2;
PrintTask left = new PrintTask(start, middle);
PrintTask right = new PrintTask(middle, end);
left.fork();
right.fork();
}
} } public class Test20 { public static void main(String[] args) throws InterruptedException {
ForkJoinPool pool = new ForkJoinPool();
pool.submit(new PrintTask(0, 300));
pool.awaitTermination(2, TimeUnit.SECONDS);
pool.shutdown();
} }

分解后的任务分别调用fork()方法开始并行执行。

RecursiveTask<T>实例:

 
如果大任务是有返回值的任务,则可以让任务继承RecursiveTask<T>,其中泛型参数T就代表了该任务的返回值类型。
package org.github.lujiango;  

import java.util.Random;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;
import java.util.concurrent.RecursiveTask; class CalTask extends RecursiveTask<Integer> {
private static final long serialVersionUID = 1L;
private static final int threshold = 20;
private int[] arr;
private int start;
private int end; public CalTask(int[] arr, int start, int end) {
this.arr = arr;
this.start = start;
this.end = end;
} @Override
protected Integer compute() {
int sum = 0;
if (end - start < threshold) {
for (int i = start; i < end; i++) {
sum += arr[i];
}
return sum;
} else {
int middle = (start + end) / 2;
CalTask left = new CalTask(arr, start, middle);
CalTask right = new CalTask(arr, middle, end);
left.fork();
right.fork();
return left.join() + right.join();
}
} } public class Test21 { public static void main(String[] args) throws InterruptedException, ExecutionException {
int[] arr = new int[100];
Random random = new Random();
int total = 0;
for (int i = 0, len = arr.length; i < len; i++) {
int tmp = random.nextInt(20);
total += (arr[i] = tmp);
}
System.out.println(total); ForkJoinPool pool = new ForkJoinPool();
Future<Integer> future = pool.submit(new CalTask(arr, 0, arr.length));
System.out.println(future.get());
pool.shutdown(); } }

  

 

最新文章

  1. 51nod算法马拉松15
  2. Mysql查看执行计划-explain
  3. 【原】http缓存与cdn相关技术
  4. Egret 压缩与解压(jszip)
  5. weizmann数据库
  6. python join与split函数的用法举例
  7. Sqoop实现自定义job的增量导入
  8. C#操作xml
  9. CentOS7安装RabbitMQ集群
  10. java 从String中匹配数字,并提取数字
  11. 表达式 - PHP手册笔记
  12. BZOJ 3040: 最短路(road) ( 最短路 )
  13. Jquery清除:hover事件
  14. 20155304 2016-2017-2 《Java程序设计》第三周学习总结
  15. 四:Java使用google的thumbnailator工具对图片压缩水印等做处理
  16. 召回率(Recall),精确率(Precision),平均正确率
  17. 关不掉.vbs
  18. 【亲测有效】Nodepad++/Sublime Text3中Python脚本运行出现语法错误:IndentationError: unindent does not match any outer indentation level解决策略
  19. ZOJ 2083 Win the Game(SG函数)题解
  20. JDBC连接池使用

热门文章

  1. 《SQL Server企业级平台管理实践》读书笔记
  2. js:输入字数限制
  3. 花间美人:古风 CG插画技法
  4. fiddler在ios10.3系统抓包https失败原因解决
  5. libev客户端
  6. 在执行migrate的时候出现问题(错误见末尾): django.db.utils.OperationalError: (1045, &quot;Access denied for user ‘ODBC‘@‘localho st‘ (using password: YES)&quot;)
  7. 深入理解JavaScript模拟私有成员
  8. 【笔记】选择框 change 事件获取内容
  9. 谈谈WEB开发跟非WEB开发各自不同的关注点
  10. SQL多表连接查询(具体实例)