Java 并发编程 Fork Join 一
来源:互联网 发布:java怎么创建数组 编辑:程序博客网 时间:2024/05/22 18:55
“分而治之”一直是一个非常有效地处理大量数据的方法。著名的MapReduce也是采取了分而治之的思想。 Fork就是分解任务,而Join 在Java线程中是等待意思 ,也就是等待计算结果。在实际应用中如果毫无顾忌地使用fork开启线程进行处理,那么很多可能会导致系统开启过多的线程而严重影响性能。所以在JDK中,给出了一个ForJoinPool线程池,对于fork方法并不急着开启线程,而是提交给ForkJoinPool线程池进行处理,以节省系统资源。
使用fork/Join 进行数据处理时的总体结构如图:
可以向ForkJoinPool线程池提交一个ForkJoinTask任务。所谓ForkJoinTask任务就是支持fork分解以及join等待的任务。ForkJoinTask有两个重要的子类 RecursiveAction和RecursiveTask。分别表示没有返回值的任务和可以携带返回值的任务。
public class CountTask extends RecursiveTask<Long> { private static final int threshold = 1000; private List<Integer> list; public CountTask(List<Integer> list) { this.list = list; } @Override protected Long compute() { long result = 0L; int size = list.size(); System.out.println("size " + size); if (size <= threshold) { for (Integer i : list) { result += i; } } else { int count = size / threshold + 1; List<CountTask> taskList = new ArrayList<CountTask>(); for (int i = 0; i < count; i++) { int toindex = 0; if (size < ((i + 1) * threshold)) { toindex = size; } else { toindex = (i + 1) * threshold; } int fromIndex =i * threshold; System.out.println("fromIndex " + fromIndex +"<><>"+"toindex " + toindex); List<Integer> subList = list.subList(fromIndex, toindex); CountTask c = new CountTask(subList); taskList.add(c); // c.fork(); c.fork(); } for (CountTask c : taskList) { result += c.join(); } } return result; } public static void main(String args[]) { ForkJoinPool fp = new ForkJoinPool(); List<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < 903000; i++) { list.add(i); } CountTask task = new CountTask(list); ForkJoinTask<Long> re = fp.submit(task); try { long res = re.get(); System.out.println(res); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
阅读全文
0 0
- Java 并发编程 Fork Join 一
- 【Java并发编程】Fork/Join
- Java并发编程--Fork/Join框架使用
- Fork/Join并发编程
- java并发Fork/join框架-java并发编程的艺术
- Java并发编程核心方法与框架-Fork-Join分治编程(一)
- Java并发编程--fork-join framework(a parallelizable algorithm)
- 《Java 7 并发编程指南》学习概要 (6) Fork/Join
- Java并发编程-23-Fork/Join 框架概述
- Java并发编程-24-创建Fork/Join线程池
- 《Java并发编程的艺术》读书笔记:Fork/Join框架
- Java并发编程系列之二十:Fork/Join框架
- Java并发编程-Fork/Join框架同步与异常
- Java并发编程五:Fork/Join框架介绍
- java并发编程的艺术---Fork/Join框架介绍
- Fork and Join(Java并发编程的思路)
- Java并发编程艺术 6 Fork/Join框架
- Java 并发编程(七)Fork/Join框架
- 自定义控件-实现ListView Item进入动画
- 提交github遇到Everything up-to-date
- CDH 5.7.0 离线安装详解
- Makefile符号 ?= :=
- Python PIL图像处理-----图像的手绘效果
- Java 并发编程 Fork Join 一
- 为什么IP层要分片而TCP层要分段? 这些和MTU/MSS又有什么关系?------tcpdump抓包实战搞起!
- hibernate_Restrictions
- eclipse下gradle构建 springMVC+spring+HibernateJPA+mysql
- 智慧楼宇篇 6 —— 室内定位技术(五)
- Adoby photoshop cs5永久序列号
- Copy和MUTableCopy
- CDOJ-1591(2017 UESTC Training for Graph Theory -A)
- Java中的String