Java使用ForkJoin框架来并行执行任务.docx

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java使用ForkJoin框架来并行执行任务

现代的计算机已经向多CPU方向发展,即使是普通的PC,甚至现在的智能手机、多核处理器已被广泛应用。在未来,处理器的核心数将会发展的越来越多。虽然硬件上的多核CPU已经十分成熟,但是很多应用程序并未这种多核CPU做好准备,因此并不能很好地利用多核CPU的性能优势。为了充分利用多CPU、多核CPU的性能优势,级软基软件系统应该可以充分“挖掘”每个CPU的计算能力,决不能让某个CPU处于“空闲”状态。为此,可以考虑把一个任务拆分成多个“小任务”,把多个小任务放到多个处理器核心上并行执行。当多个“小任务”执行完成之后,再将这些执行结果合并起来即可。如下面的示意图所示:第一步分割任务。首先我们需要有一个fork类来把大任务分割成子任务,有可能子任务还是很大,所以还需要不停的分割,直到分割出的子任务足够小。第二步执行任务并合并结果。分割的子任务分别放在双端队列里,然后几个启动线程分别从双端队列里获取任务执行。子任务执行完的结果都统一放在一个队列里,启动一个线程从队列里拿数据,然后合并这些数据。Java提供了ForkJoinPool来支持将一个任务拆分成多个“小任务”并行计算,再把多个“小任务”的结果合成总的计算结果。ForkJoinPool是ExecutorService的实现类,因此是一种特殊的线程池。ForkJoinPool提供了如下两个常用的构造器。?public ForkJoinPool(int parallelism):创建一个包含parallelism个并行线程的ForkJoinPool?public ForkJoinPool() :以Runtime.getRuntime().availableProcessors()的返回值作为parallelism来创建ForkJoinPool创建ForkJoinPool实例后,可以钓鱼ForkJoinPool的submit(ForkJoinTaskT task)或者invoke(ForkJoinTaskT task)来执行指定任务。其中ForkJoinTask代表一个可以并行、合并的任务。ForkJoinTask是一个抽象类,它有两个抽象子类:RecursiveAction和RecursiveTask。RecursiveTask代表有返回值的任务RecursiveAction代表没有返回值的任务。一、RecursiveAction下面以一个没有返回值的大任务为例,介绍一下RecursiveAction的用法。大任务是:打印0-200的数值。小任务是:每次只能打印50个数值。[java]view plaincopyprint?import?java.util.concurrent.ForkJoinPool;??import?java.util.concurrent.RecursiveAction;??import?java.util.concurrent.TimeUnit;????//RecursiveAction为ForkJoinTask的抽象子类,没有返回值的任务 ??class?PrintTask?extends?RecursiveAction?{??????//?每个小任务最多只打印50个数 ??????private?static?final?int?MAX?=?50;????????private?int?start;??????private?int?end;????????PrintTask(int?start,?int?end)?{??????????this.start?=?start;??????????this.end?=?end;??????}????????@Override??????protected?void?compute()?{??????????//?当end-start的值小于MAX时候,开始打印 ??????????if?((end?-?start)??MAX)?{??????????????for?(int?i?=?start;?i??end;?i++)?{??????????????????System.out.println(Thread.currentThread().getName()?+?的i值:??????????????????????????+?i);??????????????}??????????}?else?{??????????????//?将大任务分解成两个小任务 ??????????????int?middle?=?(start?+?end)?/?2;??????????????PrintTask?left?=?new?PrintTask(start,?middle);??????????????PrintTask?

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档