(Quick Reference)
Fork/Join convenience
Using the fork join builder
withPool(1) {pool -> //feel free to experiment with the number of fork/join threads in the pool
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
}
}"""
}
Extending the AbstractForkJoinWorker class
public final class FileCounter extends AbstractForkJoinWorker<Long> {
private final File file; def FileCounter(final File file) {
this.file = file
} protected void compute() {
long count = 0;
file.eachFile {
if (it.isDirectory()) {
println "Forking a thread for $it"
forkOffChild(new FileCounter(it)) //fork a child task
} else {
count++
}
}
setResult(count + ((childrenResults)?.sum() ?: 0)) //use results of children tasks to calculate and store own result
}
}withPool(1) {pool -> //feel free to experiment with the number of fork/join threads in the pool
println "Number of files: ${orchestrate(new FileCounter(new File("..")))}"
}