ForkJoinPool实现wordcount
ForkJoinPool:
主旨是将大任务分成若干小任务,之后再并行对这些小任务进行计算,最终汇总这些任务的结果。得到最终的结果
主要的两个思想:
(1)分治法
分治法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题的相互独立且与原问题的性质相同,求出子问题的解之后,将这些解合并,就可以得到原有问题的解。是一种分目标完成的程序算法。简单的问题,可以用二分法来完成。二分法,就是我们之前在检索的时候经常用到的Binary Search 。这样可以迅速将时间复杂度从O(n)降低到O(log n)。那么对应到ForkJoinPool对问题的处理也如此,将一个大的任务,通过fork方法不断拆解,直到能够计算为止,之后,再将这些结果用join合并。这样逐次递归,就得到了我们想要的结果。这就是再ForkJoinPool中的分治法。
工作窃取是指当某个线程的任务队列中没有可执行任务的时候,从其他线程的任务队列中窃取任务来执行,以充分利用工作线程的计算能力,减少线程由于获取不到任务而造成的空闲浪费。
实现类:
(1)RecursiveAction可以实现不带返回值的fork-join计算;
(2)通过实现RecursiveTask来进行带有返回值的计算;
wordcount实现:
功能:统计文件中单词的个数
分治法:把文本每行的内容存放到一个和数组当中,每两行进行一次单词的计数;
工作窃取:不必等待两行两行的返回结果,可以每两行开一个线程进行计算。
遇到问题:
(1)如果使用RecursiveAction,最终结果没有汇总;
(2)如果使用RecursiveTask。只能返回统计结果,无法标记是哪个单词;
(3)把结果写进文件里是与实际结果不一样。