7.6 小结
分治设计方法是一种非常流行的方法,可以用于解决各种不同的问题。你可以将原始问题分割成较小的问题,再将这些较小的问题分割成更小的问题,直到它们足够简单,可以被直接处理为止。在Java 7中,Java并发API引入了一种特殊的执行器,它是专门为解决此类问题而优化定制的。这就是Fork/Join框架。它基于Fork操作创建一个新的子任务,基于Join操作在获取结果前等待子任务结束。
采用这些操作,Fork/Join任务就会呈现如下形式:
if ( problem.size() > DEFAULT_SIZE) {childTask1=new Task();childTask2=new Task();childTask1.fork();childTask2.fork();childTaskResults1=childTask1.join();childTaskResults2=childTask2.join();taskResults=makeResults(childTaskResults1, childTaskResults2);return taskResults;} else {taskResults=solveBasicProblem();return taskResults;}
本章使用Fork/Join框架解决了三个问题:k-means聚类算法、数据筛选算法和归并排序算法。
本章使用了API提供的默认ForkJoinPool,并且创建了一个新的ForkJoinPool对象,还用到了下面三种类型的ForkJoinTasks。
RecursiveAction类,用作那些不返回结果的ForkJoinTask的基类。RecursiveTask类,用作那些返回结果任务的基类。CountedCompleter类,用作那些当所有子任务执行完毕后需要执行某个方法或者启动另一任务的任务的基类。
下一章将介绍在处理超大规模数据集时,如何使用MapReduce编程方法运用并行流技术获得最佳性能。
