java Fork/Join框架的简单使用

怎么做?

 

一、简单例子

有这样一个简单的需求:计算 1+2+3+4 的结果。

使用Fork/Join框架首先要考虑到的是如何分割任务。如果我们希望每个子任务最多执行两个数的相加,那么我们设置分割的阈值是2,由于是4个数字相加,所以Fork/Join框架会把这个任务fork成两个子任务,子任务一负责计算1+2,子任务二负责计算3+4,然后再join两个子任务的结果。

通过这个例子可以进一步了解ForkJoinTask的用法:

运行结果:

ForkJoinTask与一般的任务的主要区别在于它需要实现compute方法。

在这个方法里,首先需要判断任务是否足够小,如果足够小就直接执行任务。如果不足够小,就必须分割成两个子任务,每个子任务在调用fork方法时,又会进入compute方法,看看当前子任务是否需要继续分割。如果不需要继续分割,则执行当前子任务并返回结果。使用join方法会等待子任务执行完并得到其结果。

使用Fork/Join框架的重点,就是fork和join的配合。fork执行分割的任务,join获取任务的结果。

二、复杂一点的例子

尝试计算1+2+…..+4999+5000,每个子任务计算的最大范围在1000以内(即分为5个子任务,第一个任务从1+…..+1000,第二个任务从1001+…..+2000,以此类推)

运行结果:

我的思路:

既然计算的范围为1000以内,首先需要检测给定的两个值的范围:

如果范围在1000以内,直接计算即可:

如果不在1000以内(即start和end差距大于1000),那么end-1000+1至end这个范围是符合要求的,一定能够计算,所以启动一个新任务计算4001至5000,再启动一个新任务计算剩下的1至4000:

大概流程是这样的:

test

最后通过fork将结果汇总,就得到了1 + …. + 5000的结果。

二、总结

要清楚Fork/Join框架的思想是什么,为什么要这样做。

发表评论

电子邮件地址不会被公开。 必填项已用*标注