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方法相同
相关推荐
在Java编程语言中,ForkJoin框架是一种并行计算模型,设计用于高效处理大量可分割的任务。这个模型基于“分而治之”(Divide and Conquer)的策略,允许程序将一个大任务拆分为若干小任务,这些小任务可以并行执行,...
了解其背后的CAS(Compare and Swap)机制,以及如何在实践中应用,是并发编程中的重要技能。 5. **并发容器**:ConcurrentHashMap、ConcurrentLinkedQueue等并发容器在多线程环境下提供线程安全的数据存储。掌握...
分叉和加入本模块用于测试 Fork And Join ####1.3。 通过 RMI 使用信号量的 JVM 间同步本模块将说明使用运行在 RMI 中的基于信号量的传递管理器来控制多个 JVM 之间的同步。 ####1.4 基于阻塞队列的订单管理系统的...
- **并发请求管理**:对于需要查询大量Bitmap的情况,可以采用Fork/Join框架来并行处理多个子任务。 **问题和优化(二)TD Atom Cube信息丢失问题**:TD Atom Cube可能在小时间粒度内丢失部分细节信息。为了缓解这...
本部分涵盖了并发工具的基础知识、执行器、同步器以及锁框架,还包括并发集合、原子变量、Fork/Join框架以及完成服务的额外能力。具体知识点包括: - 探究并发工具被引入的原因。 - 探索执行器、同步器和锁框架的...
Fork/Join框架为分治算法(divide-and-conquer algorithms)提供了一种高效实现方式,它可以将一个大任务分解成若干个小任务,并在多核处理器上并行执行这些小任务,最后合并结果。 - **并发数据结构**:Java 7增强...
七、分叉与汇合(Fork and Join Nodes) 分叉与汇合是活动图中的另一个重要概念,表示的是由一种状态可以同时进入多种状态。分为水平和垂直方向。同步条用于并行执行的活动图中,成对出现,并行活动开始和结束都有...
Java 语言提供了多种并发编程机制,包括线程、Runnable、Callable、Executor、Fork/Join 框架等。 3. 线程安全 线程安全是指在多线程环境下,程序的正确性和一致性不受影响。Java 语言提供了多种线程安全机制,...
- **Fork/Join框架**:用于解决大问题的分割和并行处理。 7. **Executor部分** - **Executor基础**:Executor接口是线程池的抽象,简化了线程的创建和管理。 - **ThreadPoolExecutor的定制**:可配置核心线程数...
Fork/Join框架是一种并行计算模型,适用于分治策略。它将大任务拆分成小任务,然后将结果合并,能有效利用多核处理器的优势。 8. **CompletableFuture** CompletableFuture是Java 8引入的,它提供了丰富的异步...
通过使用fork/join、wait、@等关键字,可以明确地控制并行操作和事件触发。 ### 验证和调试工具 SystemVerilog集成了强大的验证和调试功能,如断言、覆盖率分析、随机测试等,这有助于早期发现设计错误,缩短验证...
- **ForkJoinTask 类**:Fork/Join 框架中任务的基本类型,支持异步执行和结果获取。 **19. Java 8 Stream 并行计算原理** - **Stream API**:Java 8 引入的新特性,支持函数式编程风格。 - **并行流**:利用多核...
Java 8引入了Fork/Join框架,它基于工作窃取算法,用于将大任务拆分为小任务,然后并行执行这些子任务。`ForkJoinPool`是主要的执行器,而`RecursiveTask`和`RecursiveAction`类是实现此框架的基础。通过`fork()`...
- **并发与多线程**:Java的并发库,如ExecutorService和Fork/Join框架,对于处理大规模数据至关重要。 - **Java集合框架**:对ArrayList、LinkedList、HashSet等数据结构的理解,以及它们在数据处理中的作用。 3...
- 新的并发工具,如ConcurrentHashMap和Fork/Join框架,提高了多线程编程的效率。 - 更好的内存管理,提升了垃圾回收的性能。 2. **JDK 1.7**,即Java SE 7,于2011年发布。这个版本进一步提升了Java的特性和功能...
9. ** Fork/Join框架**:这是一种并行计算模型,适用于那些可以拆分为子任务并进行并行处理的问题。 10. **并发模式**:书中可能还会介绍生产者消费者模式、读写锁模式、双端队列模式等经典的并发设计模式,帮助...
6. **高级特性**:高级话题可能包括条件生成(generate)、任务(task)和函数(function)、接口(interface)、多线程(fork-join)等,这些都是进行复杂系统设计的关键。 7. **时序逻辑**:时钟、同步和异步信号...
- **JDK 7及更高版本的新特性**:例如Fork/Join框架、Parallel Streams等,这些都是Java并发编程的最新进展。 随书附带的`concurrentbook`和`concurrentbook-jdk7`文件夹可能包含了与上述知识点对应的示例代码,...