我在这里找到了GPars中fork / join的示例:Fork/Join
import static groovyx.gpars.GParsPool.runForkJoin
import static groovyx.gpars.GParsPool.withPool
withPool() {
println """Number of files: ${
runForkJoin(new File("./src")) {file ->
long count = 0
file.eachFile {
if (it.isDirectory()) {
println "Forking a child task for $it"
forkOffChild(it) //fork a child task
} else {
count++
}
}
return count + (childrenResults.sum(0))
//use results of children tasks to calculate and store own result
}
}"""
}
它可以工作并返回正确数量的文件,但不幸的是我不理解这一行:
return count + (childrenResults.sum(0))
究竟如何工作count
和childrenResult
?
为什么0
作为参数传递给sum()
?
答案 0 :(得分:3)
我对GPars并不熟悉,但您提供的链接表明它是一个Divide-and-Conquer算法,并且稍后澄清了后面隐含的内容,并解释forkOffChild()
不等待 - 而是getChildrenResults()
确实如此。
如果您对此更熟悉,您可能会发现在同一页面中更容易理解所提供的替代方法,该方法使用更多Java-ish样式。
childrenResults
导致调用方法getChildrenResults()
,这是“Fork / Join”中的“join”,它等待所有孩子完成,然后返回一个包含它们结果的列表(或者重新抛出孩子可能抛出的任何异常。)
0
只是总和的初始值。如果childrenResult
为空,则将其汇总到count
:
groovy:000> [].sum(1)
===> 1
groovy:000> [1].sum(1)
===> 2