从Java7开始,Java提供了一个并发式编程框架,Fork & Join。
简单来讲,用户可以将一个较大的计算任务分成多个子任务,并在子任务完成后合并它们的结果(如果有的话)。
所谓的计算任务,其实是ForkJoinTask<V>对象。这个类有两个派生类,RecursiveAction(无返回结果),RecursiveTask(有返回结果)。从它们的名字就可以看出一些端倪。它们会生成一些子任务,而子任务又会生成新的子任务。子子孙孙,直至计算穷尽。
计算任务放到一个ForkJoinPool中执行。这其实一个特殊的ExecutorService,其特殊之处就在于它内部的各个线程会去积极的偷其他线程产生的子任务。这样就可以保证最高的计算效率。
使用过程是这样:
- 为计算任务设计一个类,派生自RecursiveTask<V>或RecursiveAction<V>
- 在该类的compute方法内产生子任务,并调用子任务的fork和join方法
- 生成一个该类的对象
- 生成一个ForkJoinPool对象
- 将计算对象加入(submit)到池对象中
- 等待submit的Future结果