原文链接:ForkJoin与for循环与stream并行流运行时间比较 – 编程屋
1 什么是ForkJoin
ForkJoin框架:在一定情况下,将一个大任务,进行拆分(fork)成若干个小任务,直到这个小任务不可再拆,然后再将一个个小任务获得的结果进行join合并汇总
2 ForkJoin中的工作窃取算法
工作窃取算法就是如果我们需要将一个大的任务进行拆分成每个小任务,然后将每个小任务放到不同的队列里面并且交给每个单独的线程去执行。比如A线程处理A线程里的任务,B线程处理B线程里面的任务,但是A线程里面的任务执行完了,B线程的任务还没有执行完,依然有任务在等待B线程去处理,此时A线程就会去将B线程的任务窃取过来,但是在这是他们访问都是同一个队列,所以为了减少窃取任务线程和被窃取任务线程之间的竞争,通常会使用双端队列,被窃取任务的线程永远从头部拿去任务,而窃取任务的线程从队列的尾部获取任务执行。
3 ForkJoin的运用
此处先将forkjoin与for循环以及java8中的并行流进行比较,至于forkjoin的方法介绍会在之后讲到
首先我们计算某一个区间的值,我们将会采用3中方法去计算它并进行一个时间的比较
上图是一个计算某一段区间内简单算法,临界值为500000,小于这个临界值就进行累加,大于这个临界值就继续进行拆分,最后将拆分的结果进行合并
我们用测试类进行测试
运用forkjoin框架计算的值耗时473毫秒
用普通for循环进行累加求和用时782毫秒
利用Java8并行流计算累加耗费时间为217毫秒
在此我们要注意,由于forkjoin中拆分也需要时间,所以有时所需要计算数值过小时会出现for循环的时间少于forkjoin所需时间
由测试结果可得运算时间为:Java8运行流>forkjoin>for循环
以上只是部分内容,为了维护方便,本文已迁移到新地址:ForkJoin与for循环与stream并行流运行时间比较 – 编程屋