`

ForkAndJoin实践

阅读更多

Java的并发编程模型中,有个Fork-Join框架,目的是将大的任务分解成小的任务进行计算,然后再把每个小任务的计算结果汇总。

Fork / Join 框架提供了两个可供继承的子类

1,RecursiveAction 用以分解没有计算结果的任务

2,RecursiveTask    用以分解有计算结果的任务

 

接下来计算一个1加到100的程序,体会一下Fork/Join框架的使用

 

首先定义一个任务类CountTask类,因为是要计算结果,因此继承RecursiveTask类,主要是实现其compute方法,这里设置的阀值THRESHOLD值为10,表示每个任务计算的加数的个数最多为10个,接下来就是将任务根据阀值分组,并对每个分组进行计算

 

package com.luchi.thread.forkAndJoin;

import java.util.concurrent.RecursiveTask;

public class CountTask extends RecursiveTask<Integer>{

	private static final int THRESHOLD=10;//设置阀值
	private int start;
	private int end;
	
	public CountTask(int start, int end) {
		super();
		this.start = start;
		this.end = end;
	}

	@Override
	protected Integer compute() {
		// TODO Auto-generated method stub
		int sum=0;
		//看任务是不是在阀值以下
		boolean canComputs=(end-start+1)<=THRESHOLD;
		if(canComputs){
			for(int i=start;i<=end;i++){
				sum+=i;
			}
			return sum;
		}else{
			int size=end-start+1;
			int taskNum;
			if(size%THRESHOLD==0){
				taskNum=size/THRESHOLD;
			}else{
				taskNum=size/THRESHOLD+1;
			}
			for(int i=1;i<=taskNum;i++){
				
				int groupBegin=start+(i-1)*THRESHOLD;
				int groupEnd=Math.min(groupBegin+THRESHOLD-1, end);
				CountTask childTask=new CountTask(groupBegin, groupEnd);
				childTask.fork();
				int childCount=childTask.join();
				sum+=childCount;
			}
			return sum;
		}
	}

}

 

 

看一下测试程序TestForkAndJoin类,fork/join需要使用ForkJoinPool容器,这个容器负责执行每个task

 

package com.luchi.thread.forkAndJoin;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;

public class TestForkAndJoin {
	
	
	
	
	public static void main(String[]args){
		
		ForkJoinPool forkJoinPool=new ForkJoinPool();
		CountTask task=new CountTask(1,100);
		Future<Integer> result=forkJoinPool.submit(task);
		try {
			System.out.println(result.get());
		} catch (InterruptedException | ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	

}

 

其实这个模型和FutureTask使用方法差不多,不同的是,FutureTask是单线程使用,而ForkJoinPool里面保持了一个ForkJoinTask数组用来保存多个任务,同时ForkJoinWorkerThread用来执行任务,我的理解就是ForkJoin框架提供了一个多线程的执行环境用来执行多个任务而已,而其join方法和其他地方的join方法相同

 

分享到:
评论

相关推荐

    simple-fork-join:ForkJoin的简单示例

    在Java编程语言中,ForkJoin框架是一种并行计算模型,设计用于高效处理大量可分割的任务。这个模型基于“分而治之”(Divide and Conquer)的策略,允许程序将一个大任务拆分为若干小任务,这些小任务可以并行执行,...

    PDF-Java7ConcurrencyCookbook-英文版.rar

    了解其背后的CAS(Compare and Swap)机制,以及如何在实践中应用,是并发编程中的重要技能。 5. **并发容器**:ConcurrentHashMap、ConcurrentLinkedQueue等并发容器在多线程环境下提供线程安全的数据存储。掌握...

    redar:Java Swift Knife 项目.. - 线程、Quartz、Spring、Spring Integration、Apache Mina、Python

    分叉和加入本模块用于测试 Fork And Join ####1.3。 通过 RMI 使用信号量的 JVM 间同步本模块将说明使用运行在 RMI 中的基于信号量的传递管理器来控制多个 JVM 之间的同步。 ####1.4 基于阻塞队列的订单管理系统的...

    海量数据OLAP分析实践-TD Atom Cube

    - **并发请求管理**:对于需要查询大量Bitmap的情况,可以采用Fork/Join框架来并行处理多个子任务。 **问题和优化(二)TD Atom Cube信息丢失问题**:TD Atom Cube可能在小时间粒度内丢失部分细节信息。为了缓解这...

    Java Threads and the Concurrency Utilities

    本部分涵盖了并发工具的基础知识、执行器、同步器以及锁框架,还包括并发集合、原子变量、Fork/Join框架以及完成服务的额外能力。具体知识点包括: - 探究并发工具被引入的原因。 - 探索执行器、同步器和锁框架的...

    Packt.Java.7.Concurrency.Cookbook

    Fork/Join框架为分治算法(divide-and-conquer algorithms)提供了一种高效实现方式,它可以将一个大任务分解成若干个小任务,并在多核处理器上并行执行这些小任务,最后合并结果。 - **并发数据结构**:Java 7增强...

    EA UML活动图第2次笔记.docx

    七、分叉与汇合(Fork and Join Nodes) 分叉与汇合是活动图中的另一个重要概念,表示的是由一种状态可以同时进入多种状态。分为水平和垂直方向。同步条用于并行执行的活动图中,成对出现,并行活动开始和结束都有...

    2023 java并发编程手册

    Java 语言提供了多种并发编程机制,包括线程、Runnable、Callable、Executor、Fork/Join 框架等。 3. 线程安全 线程安全是指在多线程环境下,程序的正确性和一致性不受影响。Java 语言提供了多种线程安全机制,...

    并发编程实践,全面介绍基础知识、JVM同步原语、线程安全、低级并发工具、线程安全容器、高级线程协作工具、Executor部分等

    - **Fork/Join框架**:用于解决大问题的分割和并行处理。 7. **Executor部分** - **Executor基础**:Executor接口是线程池的抽象,简化了线程的创建和管理。 - **ThreadPoolExecutor的定制**:可配置核心线程数...

    JUC线程锁框架

    Fork/Join框架是一种并行计算模型,适用于分治策略。它将大任务拆分成小任务,然后将结果合并,能有效利用多核处理器的优势。 8. **CompletableFuture** CompletableFuture是Java 8引入的,它提供了丰富的异步...

    SystemVerilog For Design_ A Guide to Using SystemVerilog for Hardware Design and Modeling.pdf

    通过使用fork/join、wait、@等关键字,可以明确地控制并行操作和事件触发。 ### 验证和调试工具 SystemVerilog集成了强大的验证和调试功能,如断言、覆盖率分析、随机测试等,这有助于早期发现设计错误,缩短验证...

    深入浅出Java多线程.pdf

    - **ForkJoinTask 类**:Fork/Join 框架中任务的基本类型,支持异步执行和结果获取。 **19. Java 8 Stream 并行计算原理** - **Stream API**:Java 8 引入的新特性,支持函数式编程风格。 - **并行流**:利用多核...

    JavaConnect:Java 8中的并发并使用与并发相关的库

    Java 8引入了Fork/Join框架,它基于工作窃取算法,用于将大任务拆分为小任务,然后并行执行这些子任务。`ForkJoinPool`是主要的执行器,而`RecursiveTask`和`RecursiveAction`类是实现此框架的基础。通过`fork()`...

    Practical Real time Data Processing and Analytics

    - **并发与多线程**:Java的并发库,如ExecutorService和Fork/Join框架,对于处理大规模数据至关重要。 - **Java集合框架**:对ArrayList、LinkedList、HashSet等数据结构的理解,以及它们在数据处理中的作用。 3...

    jdk1.6 1.7合集源码

    - 新的并发工具,如ConcurrentHashMap和Fork/Join框架,提高了多线程编程的效率。 - 更好的内存管理,提升了垃圾回收的性能。 2. **JDK 1.7**,即Java SE 7,于2011年发布。这个版本进一步提升了Java的特性和功能...

    java并发编程实战源码,java并发编程实战pdf,Java

    9. ** Fork/Join框架**:这是一种并行计算模型,适用于那些可以拆分为子任务并进行并行处理的问题。 10. **并发模式**:书中可能还会介绍生产者消费者模式、读写锁模式、双端队列模式等经典的并发设计模式,帮助...

    Verilog HDL 华为入门教程

    6. **高级特性**:高级话题可能包括条件生成(generate)、任务(task)和函数(function)、接口(interface)、多线程(fork-join)等,这些都是进行复杂系统设计的关键。 7. **时序逻辑**:时钟、同步和异步信号...

    实战Java高并发程序设计第二版随书代码

    - **JDK 7及更高版本的新特性**:例如Fork/Join框架、Parallel Streams等,这些都是Java并发编程的最新进展。 随书附带的`concurrentbook`和`concurrentbook-jdk7`文件夹可能包含了与上述知识点对应的示例代码,...

Global site tag (gtag.js) - Google Analytics