09-结果分析
结果分析
本案例实现了如下两个任务。
DocumentTask
:该类根据start
和end
属性处理了对应文档中的行集合。如果行数小于10
,则对每行创建LineTask
对象,当任务执行完毕后,汇总运行结果并返回。如果任务对应的行集合大于等于10
,则将集合分割为两个子集,并创建两个DocumentTask
对象来处理这些新集合。当这些任务执行完毕后,汇总子任务的结果并返回。LineTask
:该类处理文档中一行的单词。如果单词个数小于100,则任务直接在单词集合中搜索单词并返回单词的出现次数;否则,将单词集合分割成两个子集并创建两个LineTask
对象来处理这些集合。当这些任务执行完毕后,汇总子任务的结果并返回。- 在
Main
类中,我们在DocumentTask
类中执行默认的ForkJoinPool
(调用静态方法commonPool()
来获取),该DocumentTask
类处理每行1000个单词共100
行的文档。该任务会使用其他的DocumentTask
对象和LineTask
对象分割任务,以便这些任务执行完毕后,可以使用初始任务来获取整个文档中单词出现的次数。 - 为了让任务返回执行结果,这些任务继承了
RecursiveTask
类。调用get()
方法可获取任务的返回值,该方法在Future
接口中声明,在RecursiveTask
类中实现。 - 运行程序时,你可以对比控制台输出的第一行和最后一行。第一行是文档生成时统计的单词出现次数,最后一行是fork/join任务统计的单词出现次数。