package com.zenika.java7.forkjoin.fs;
import java.io.File;
import java.util.ArrayList;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
public class CountDirectoriesTask extends RecursiveTask<Long> {
private static final long serialVersionUID = 1L;
private File root;
public CountDirectoriesTask(File root) {
this.root = root;
}
protected Long compute() {
long size = 0;
File[] files = root.listFiles();
ArrayList<ForkJoinTask<Long>> subtasks = new ArrayList<ForkJoinTask<Long>>();
for (File f : files) {
if (f.isDirectory()) {
subtasks.add(new CountDirectoriesTask(f).fork());
++size;
}
}
for (ForkJoinTask<Long> subtask : subtasks) {
size += subtask.join();
}
return size;
}
}