Java Fork/Join 应用

来源:互联网 发布:大都会 友邦 知乎 编辑:程序博客网 时间:2024/04/29 04:40

本文简要阐述一下 Java Fork/Join Framework并行编程框架,无意班门弄斧,旨在小作笔记。


背景

        近些年,多核处理器计算机的普及,并行编程越来越成为一种趋势。学会并行思考,编写高效率的代码,总是深深的诱惑着我。也许大多数人都跟我怀有同样的想法,而且,Java也预测到并行编程的魅力,于是,提供了Fork/Join 这种以清晰、高效、简单、可伸缩地利用多核处理器的强大工具。

        Fork/Join通过两种方式增强多线程编程:

              Fork/Join Framework 简化了多线程的创建和使用;

              Fork/Join Framework自动使用多处理器

        在传统 的多线程编程中,大多数计算机只有一个CPU,多线程主要利用空闲时间;当有多个CPU时,使用两个或多个CPU,可以同时执行程序的各个部分,每一部分在自己的CPU上运行,从而可以显著提升某些操作的执行速度,例如排序、变换或搜素大型数组。


主要的 Fork/Join 类

ForkJoinTask<V>:     用来定义任务的抽象

ForkJoinPool:            管理ForkJoinTasks的执行

RecursiveAction:       ForkJoinTask<V>的子类,用于不反回值的任务

RecursiveTask<V>:  ForkJoinTask<V>的子类,用于不反回值的任务

        下面是它们之间的关系:

ForkJoinPool管理ForkJoinTask的执行,ForkJoinTask是抽象类,另外两个抽象类——RecursiveAction和RecursiveTask进行了扩展。通常代码会扩展这些类以创建任务。


分而治之策略

分而治之的策略基于如下机制:将任务递归划分成更小的子任务,知道子任务足够小,从而能被联系的处理为止。例如,对于包含N个整数的数组,转换数组中每个元素的任务可以划分成两个子任务,每个子任务处理数组中一半的元素。也就是说,一个子任务转成0到N/2的元素,另一个子任务转换N/2到N的元素,每个子任务又可以一次被划分为另外一组子任务,每个子任务转换剩余元素的一半,这种划分数组的过程一直持续下去。直到达到某个临界点为止,在该临界点,连续的解决方案比进行另一次划分更快。

分而治之的优势在于处理过程可以并行发生。这也是ForkJoinTask背后的主要思想。


看官别走,接下来的文章将会举个小例子。



原创粉丝点击