详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp83
这篇我们来简要了解一下JavaSE7中提供的一个新特性 —— Fork Join 框架。
0. 处理器发展和需求背景
回想一下并发开发的初衷,其实可以说是有两点,或者说可以从两个方面看。
- 对于单核的处理器来说,在进行IO操作等比较费时的操作进行时,如果执行任务的方式是单任务的,那么CPU将会“空转”,知道IO操作结束。如果有多任务的调度机制,则在一个任务不需要CPU支持的时候,CPU可以被调度处理其他任务。简单地讲,并发可以提高CPU计算资源的利用率。
- 对于多核,或者多个计算资源的情况下,并发可以在某种程度上达到“并行”,即同时运行,缩短了任务完成的时间,提高了任务完成的效率。
我们再来看一下处理器计算能力的发展(讲并发或者并行基本都要提到),Intel的创始人之一Gordon Moore曾经说过一句话,大概意思是:
当价格不变时,集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,性能也将提升一倍。
我们可以这样理解,处理器的计算能力在一定意义上和芯片上集成的晶体管数量有关,而这项继承技术的发展史飞快的。但是,什么事情都是有一个极限的,提升计算性能仅仅靠增加晶体管数量提高处理器主频是不现实的,于是多核处理器的概念就出来了。
随着在硬件上多核处理器的发展和广泛使用,软件开发上的变革也在进行。简单来想,对于多个不相关的小任务来讲,可以分派到不同的处理器核心来进行处理。然而,对于一个比较大的任务,如何能够充分利用多核计算资源就是一个值得考虑的问题。
解决这个问题的办法就是“分而治之”,而Fork Join正式这样一种思路的产物。
1. Fork Join 的设计简介
看过《Introduction to Algorithms》(《算法导论》)的朋友们应该还记得,在讲到归并排序(Merge Sort)和快速排序的时候,有一种很简单又很有效率的思路就是“分而治之”,即“分治法”。而Fork Join的思路也是同理,只不过划分之后的任务更适合分派给不同的计算资源,可以并行的完成任务。
当计算分别完成之后,最后再合并回来。
简单来看,就是一个递归的分解和合并,知道任务小到可以接受的程度。
2. Fork Join 设计要点
Fork Join设计出来就是为了提高任务完成的效率,围绕这个目标,有一些要点是设计中需要考虑的,下面就给出一些要点。
- 线程的管理和线程的单纯性。基于如上的设计思路,我们可以看到子任务之间的相关性是相对比较简单的,可以并行处理。为了提高效率,并不需要重量级的线程结构和对应的线程维护,线程实现简单就好,满足需求即可,降低维护成本。
- 队列机制,硬件支持一定是比较有限的,那么分解的任务应该用队列维护起来,一个好的队列设计是很有必要的。
- “工作窃取”,也就是设计论文原文中提到的 Work Stealing 。对于负载比较轻的线程,可以帮助负载较重的执行线程分担任务。
对于使用Fork Join的开发者来讲,需要注意:
- 可用线程数和硬件支持。线程这东西,也是有开销的东西,绝对不是越多越好,尤其在硬件基础有限的情况下。
- 任务分解的粒度。和前者有关系,就是分解的任务,“小”到什么程度是可以接受的,不可再分。
3. Fork Join数据结构支持
按照如上设计,分解执行一个大的任务,Fork Join至少需要考虑如下一些数据结构。
- 轻量级的线程结构。
- 维护线程的线程池,负责线程的创建,数量维护和任务管理。
- 维护任务,并支持Work Stealing的双端队列。如下图。
对于子任务的分解,可以从后端取出分解再放入,而对于WorkStealing则可以从头部取出,放入其他队列的尾部。
到此,本文仅仅是对Fork Join的大致设计思路做一个描述、勾勒。下一篇文章中会对JDK1.7中给出的实现作出分析。
相关推荐
ForkJoin并发框架是Java 7引入的一种高效并行计算框架,它基于分而治之(Divide and Conquer)的策略,适用于处理大量可分割的任务。这个框架的核心类是`ForkJoinPool`和`ForkJoinTask`,它们为开发者提供了创建和...
Java并发Fork-Join框架原理是Java7中提供的一种并行执行任务的框架,旨在提高程序的执行效率和性能。该框架的核心思想是将大任务分割成若干个小任务,并将其分配给不同的线程执行,以充分利用多核CPU的计算能力。 ...
ForkJoin框架 是Java 7中引入的,旨在进一步提高并发程序的性能。它使用了一种称为“工作窃取”的算法,允许线程动态地重分配任务。ForkJoin的核心思想是将大任务分解为更小的任务,然后并行处理这些任务,最后合并...
Fork/Join框架是Java并发库中的一部分,自Java 7开始引入,它为开发者提供了一种高效的处理大规模计算任务的方法。这个框架基于分治策略,将大任务分解成若干小任务,然后并行执行这些小任务,最后再将结果合并。...
Fork/Join 框架是 Java 7 中引入的一种新的并发编程模型,它可以将一个大任务拆分成多个小任务,并将这些小任务分配给多个线程来执行,然后将这些小任务的结果合并起来,形成最终的结果。 Fork/Join 框架的优点是...
Java ForkJoin框架的原理及用法 Java ForkJoin框架是Java 1.7后提供的一种多线并发处理框架,主要思想是分而治之,将复杂的计算按照设定的阈值进行分解成多个计算,然后将各个计算结果进行汇总。ForkJoin框架的使用...
在Java编程中,线程池和并发任务执行是常见的方式,但在某些场景下,我们可以利用JDK的ForkJoin框架来构建更加高效和易用的并发组件。ForkJoin框架自Java 7引入,它为处理大型任务提供了一种分解成多个子任务并行...
Java并发框架是Java JDK中内置的一系列用于处理多线程并行执行的工具和类库,自JDK 5.0引入以来,极大地简化了并发编程的复杂性。这个框架由Doug Lea设计,并在JSR-166任务中提出,最终在Tiger(JDK 5)版本中被引入...
在这个"Java8集合 CompletableFuture lambda表达式 新的TimeAPI 和ForkJoin Demo包"中,我们可以深入探讨以下几个关键知识点: 1. **Lambda表达式**: Lambda表达式是Java 8的一大亮点,它简化了对匿名函数的处理...
Java并发编程是一个复杂而重要的主题,它涉及到多线程、同步机制、线程池和并发容器等关键概念。Amino框架是Java并发编程领域的一个工具,它旨在简化并发编程,提高程序的性能和可维护性。这篇博客文章可能详细探讨...
《java并发编程的核心方法和框架》这本书旨在深入探讨这一主题,帮助开发者掌握Java环境下的并发处理技巧。 1. **线程基础** - **线程创建**:Java提供了两种主要的线程创建方式,一是通过实现`Runnable`接口,二...
《Java 7并发编程实战手册》是一本深入探讨Java并发编程的权威著作,它涵盖了大量实用的技巧和最佳实践,旨在帮助开发者在多线程环境下编写高效、安全的代码。这本书的实例代码提供了丰富的示例,使读者能够直观地...
《Java 7并发编程实战手册》是一本深入探讨Java并发编程的权威指南,它涵盖了Java 7版本中的并发工具和最佳实践。这本书的源码打包提供了丰富的实例,可以帮助读者更好地理解并应用书中所讲解的概念。这里我们将详细...
这个"java高并发秒杀api源码"很可能是一个实现这类功能的示例项目,它结合了Spring和MyBatis两大主流框架,以提升系统性能和可维护性。下面,我们将深入探讨这些关键知识点。 首先,`Spring`是一个全面的企业级应用...
通过阅读《Java 7并发编程实战手册》,开发者不仅能理解这些特性和工具的原理,还能学习如何在实际项目中应用它们,解决并发问题。配合书中的源码分析,可以更直观地理解多线程编程的实践技巧。同时,111.zip可能...
书中的章节可能会详细解释这些集合的设计原理和使用场景,帮助读者理解如何在并发环境中选择合适的集合类型。 此外,书中可能还会涉及其他并发编程相关的高级话题,比如原子变量(`AtomicInteger`, `...
此外,书中可能还会涉及线程优先级、守护线程、线程中断等特性,以及Java 5及以后版本引入的并发改进,如 Fork/Join 框架和 Parallel Streams。 最后,实际应用中的并发最佳实践和调试技巧也是必不可少的。例如,...
5. **J.U.C框架**:Java并发 utilities (J.U.C) 框架是Java并发编程的重要组成部分,书中会介绍如何利用这个框架来提升并发性能和代码的可读性。 6. **性能调优**:在高并发场景下,性能优化是必不可少的。可能涵盖...