`
seaboycs
  • 浏览: 128239 次
  • 性别: 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  
最近正好涉及到这个概念 写得灰常好~ 赞~\(≧▽≦)/~

相关推荐

    Fork/Join例子

    标题“Fork/Join例子”暗示我们将探讨一个具体的示例,展示如何使用这个框架来解决问题。通常,这样的例子会涵盖创建自定义的`RecursiveTask`或`RecursiveAction`类,以及如何使用`ForkJoinPool`来执行它们。 描述...

    fork/join 实例

    Fork/Join框架是Java并发处理的一个重要工具,它基于工作窃取算法,设计用于高效地执行并行计算任务。这个框架是Java 7引入的,位于`java.util.concurrent.fork/join`包中,目的是简化多核处理器环境下大规模数据...

    Java并发Fork and join

    快速排序是一个经典的适合使用Fork/Join框架的例子。首先创建一个`RecursiveTask`来表示排序任务,任务会检查数组的大小,如果数组元素少于某个阈值,就直接排序(递归结束条件);否则,将数组一分为二,分别创建两...

    浅谈Java Fork/Join并行框架

    一个最简单的例子是使用 Fork/Join 框架来求一个数组中的最大/最小值,这个任务就可以拆成很多小任务,大任务就是寻找一个大数组中的最大/最小值,我们可以将一个大数组拆成很多小数组,然后分别求解每个小数组中的...

    Java Fork/Join框架

    Java Fork/Join框架是Java 7引入的一种并行计算模型,设计目的是为了高效地处理大量数据,尤其是在多核处理器环境中。该框架的核心理念是通过将复杂的大任务分解为多个小任务,然后并行执行这些小任务,从而加速计算...

    Java通过Fork/Join优化并行计算

    Java的Fork/Join框架是Java 7引入的一个并行计算工具,它是基于分而治之(Divide and Conquer)策略的。该框架旨在简化并行编程,尤其是在多核处理器环境中提高性能。Fork/Join框架的核心类包括`ForkJoinPool`和`...

    译文:Fork and Join: Java Can Excel at Painless Parallel Programming Too!

    本文将简要回顾Java中的并发编程基础知识,介绍java.util.concurrent包提供的高级并发原语,并深入探讨Fork/Join框架及其在Java SE 7中的应用。 首先,让我们回顾一下Java中基本的并发机制。自Java早期版本起,线程...

    JDK7中的ForkJoin模式

    JDK 7 中引入的 Fork/Join 模式是一种基于分治策略的并行编程模型,旨在简化在多核处理器环境下实现高效的并行计算。这一模式的核心思想是将复杂的大任务拆分成一系列小任务,然后将这些小任务并行执行,最后再合并...

    ForkJoin并发框架入门示例

    ForkJoin并发框架是Java 7引入的一种高效并行计算框架,它基于分而治之(Divide and Conquer)的策略,适用于处理大量可分割的任务。这个框架的核心类是`ForkJoinPool`和`ForkJoinTask`,它们为开发者提供了创建和...

    常用多线程模板与鱼刺类多线程线程池应用小例子

    接下来,我们转向“鱼刺类”(Fork/Join框架),这是Java 7引入的一种高级线程池模型,主要用于解决可分解的大问题。它的设计灵感来源于分治法,将大任务拆分为更小的子任务,然后递归地解决这些子任务,最后将结果...

    基于JDK的ForkJoin构建一个简单易用的并发组件1

    虽然对于商品详情页面展示这个特定例子,直接使用线程池可能已经足够,但在处理更大规模、更复杂的问题时,ForkJoin框架能带来显著的性能提升。通过学习和熟练运用ForkJoin,开发者可以构建出更加灵活、高效的并发...

    Stream流式计算、ForkJoin和异步回调.md

    综上所述,Stream流式计算、ForkJoin框架以及异步回调都是Java开发中非常重要的概念和技术。它们分别针对数据处理、并行计算以及异步操作提供了高效的解决方案,对于提升程序性能具有重要意义。

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

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

    java中的forkjoin框架的使用

    否则,任务会被拆分为两个子任务,分别处理数组的一半,然后将两个子任务的结果相加,这就是fork和join的过程。 在实际使用ForkJoinPool时,我们可以通过submit方法提交任务: ```java ForkJoinPool pool = new ...

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

    未完成模块阿里Java手册、java8,注解,fork/join,加解密等。欢迎fork,欢迎交流。拿起微信,关注公众号「程序员泥瓦匠」给教程的开源代码仓库点个星吧GitHub(java-core-learning-example)Gitee(java核心学习...

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

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

    《Java7并发编程实战手册》书中实例代码

    例如,你可以找到使用Fork/Join框架实现的矩阵乘法,使用`ConcurrentHashMap`进行并发操作的例子,以及如何有效利用`CountDownLatch`、`CyclicBarrier`和`Semaphore`来控制并发流程的示例。 总之,《Java 7并发编程...

    最新Java 8 API

    Fork/Join框架用于将大型任务分解为子任务,而Parallel Streams则利用多核处理器的优势并行执行流操作。 9. **新的基数转换API**:`Integer.toUnsignedString()` 和 `Integer.parseInt(String, int radix)` 等方法...

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

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

    java8源代码内容

    最后,Java 8还优化了并行数组处理,提供并行流(Parallel Streams)和Fork/Join框架,可以充分利用多核处理器的优势,提高计算密集型任务的执行速度。 综上所述,Java 8源代码对于学习和理解这些新特性的实现机制...

Global site tag (gtag.js) - Google Analytics