`
seaboycs
  • 浏览: 127124 次
  • 性别: Icon_minigender_1
  • 来自: 南通
社区版块
存档分类
最新评论

Java Fork/Join 例子

阅读更多

先引用<<Java 7 Concurrency Cookbook>>书中一段关于Fork Join的描述:

This framework is designed to solve problems that can be broken into smaller tasks using
the divide and conquer technique. Inside a task, you check the size of the problem you wantto resolve and, if it's bigger than an established size, you divide it in smaller tasks that are executed using the framework. If the size of the problem is smaller than the established size,you solve the problem directly in the task and then, optionally, it returns a 
result. The following diagram summarizes this concept:



描述很清楚,易懂。Fork 就是把任务划分, Join就是等所有的子任务都完成后执行的合并操作。

 

前提就是 所谓的任务要可以拆分,比如说有求10万个数字的和,可以改成2个5万数字求和的求和,再可以分成4个2.5万数字求和的求和的求和。

 

就拿求和做个例子(1-100求和):

 

package com.javaeye.demo;

import java.util.List;
import java.util.concurrent.RecursiveTask;

public class Task extends RecursiveTask<Integer>{

	private static final long serialVersionUID = 1L;
	
	private List<Integer> numberList;
	private int start;
	private int end;
	private int THRESHOLD = 10;
	
	public Task(List<Integer> numberList) {
		this.numberList = numberList;
		start = 0;
		end = this.numberList.size() - 1;
	}
	
	public Task(List<Integer> numberList, int start, int end) {
		this.numberList = numberList;
		this.start = start;
		this.end = end;
	}
	
	@Override
	protected Integer compute() {
		if (end - start <= THRESHOLD) {
			return sum();
		} else {
			int pivot = (end + start )/2;
			Task task1 = new Task(numberList, start, pivot);
			Task task2 = new Task(numberList, pivot+1, end);
			task1.fork();
			task2.fork();
			return 	task1.join() + task2.join();
		}
		
	}

	private Integer sum() {
		Integer sum = 0;
		for (int i = start;i <= end; i++) {
			sum += this.numberList.get(i);
		}
		return sum;
	}
}

 

package com.javaeye.demo;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;

public class Main {

	public static void main(String[] args) throws Exception{
		ForkJoinPool pool = new ForkJoinPool();
		
		Task task = new Task(getData(100));
		Future<Integer> result = pool.submit(task);
		System.out.println(result.get());
	}
	
	private static List<Integer> getData(int len) {
		List<Integer> list = new ArrayList<Integer>();
		for (int i=1; i <= len; i++) {
			list.add(i);
		}
		return list;
	}

}

 
输出结果: 5050.

 

只为简单记录。
 

  • 大小: 17.9 KB
分享到:
评论
1 楼 wengeldouble 2014-02-24  
最近正好涉及到这个概念 写得灰常好~ 赞~\(≧▽≦)/~

相关推荐

    Java Fork/Join框架

    Fork/Join框架是Java7中新增的一项特性,也是Java7平台的其中一项主要改进。下面我们就来简单探讨下Java的Fork/Join框架

    ForkAndJoinUtility:实用程序类可轻松使用 java 中的 join 和 fork 功能

    JoinAndForkUtility 可轻松使用 java 7 中的 join 和 fork 功能的实用程序类。 易于使用并提高耗时 for 循环的性能。 更多的是尝试将 fork/join/compute 方法等与业务问题分离。用法如果您必须为大量对象循环耗时的...

    Java 核心系列教程,关于Java核心技术学习积累的例子,是初学者及核心技术巩固的最佳实践

    Java 核心系列教程,关于Java核心技术学习积累的例子,是初学者及核心技术巩固的最佳实践。包括基础语法,OOP,字符串,集合,IO,反射,线程,网络等... 未完成模块:阿里Java手册、java8,注解,fork/join,加解密等。

    jdk7新特性jdk8新特性

    ## 使用ForkJoin Java 7开始引入了一种新的Fork/Join线程池,它可以执行一种特殊的任务:把一个大任务拆成多个小任务并行执行。 我们举个例子:如果要计算一个超大数组的和,最简单的做法是用一个循环在一个线程内...

    java-core-learning-example:关于Java核心技术学习积累的例子,是初学者及核心技术巩固的最佳实践

    未完成模块:阿里Java手册,java8,注解,fork / join,加解密等。 我微信:bysocket01,加入纯技术交流群,成长技术 给教程的开源代码仓库点个Star吧 帮忙分享该系列文章链接给更多的朋友 如果您对Java基础核心类...

    JDK7-Java7-JavaSE7新特性和增强功能-第一部

    3. 提供使用场景,例子参考说明.4. 熟悉JDK7新特性和库对Android开发(基于Java语言)更加得心应手。 5. 熟悉JDK7新特性能方便进行Java底层开发,比如Spring MVC. 6. IDE目前基于轻便的VSCode开发说明, 也可以自行通过...

    JBPM4工作流应用开始指南.rar

    84 6.2.1 start(开始活动) 85 6.2.2 state(状态活动) 86 6.2.3 decision(判断活动) 89 6.2.4 fork – join(分支/聚合活动) 97 6.2.5 end(结束活动) 102 6.2.6 task(人工任务活动) 107 6.2.7 sub-process...

    JBPM工作流开发指南

    2.2 、Hello World 例子 6 三、学习JPDL 11 3.1 、简介 11 3.2 、流程版本(Version) 11 3.3 、流程定义 12 3.3.1 process-definition(流程定义) 12 3.3.2 node(自动节点) 13 3.3.3 start-state(开始状态) 13 3.3.4...

    汪文君高并发编程实战视频资源全集

     高并发编程第三阶段34讲 ForkJoin框架之RecursiveAction_.mp4  高并发编程第三阶段35讲 Phaser工具的实战案例使用第一部分_.mp4  高并发编程第三阶段36讲 Phaser工具的实战案例使用第二部分_.mp4  高并发编程第...

    汪文君高并发编程实战视频资源下载.txt

     高并发编程第三阶段34讲 ForkJoin框架之RecursiveAction_.mp4  高并发编程第三阶段35讲 Phaser工具的实战案例使用第一部分_.mp4  高并发编程第三阶段36讲 Phaser工具的实战案例使用第二部分_.mp4  高并发编程第...

Global site tag (gtag.js) - Google Analytics