packagecom.bird.concursey.charpet8;importjava.io.File;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.ForkJoinPool;importjava.util.concurrent.RecursiveTask;public class FolderProcessor extends RecursiveTask>{private static final long serialVersionUID = 1L;privateString path;privateString extension;publicFolderProcessor(String path, String extension) {super();this.path =path;this.extension =extension;
}
@Overrideprotected Listcompute() {
List list = new ArrayList();
List tasks = new ArrayList();
File file= newFile(path);
File content[]=file.listFiles();if(content != null) {for(int i = 0; i < content.length; i++) {if(content[i].isDirectory()) {
FolderProcessor task= newFolderProcessor(content[i].getAbsolutePath(), extension);//异步方式提交任务
task.fork();
tasks.add(task);
}else{if(checkFile(content[i].getName())) {
list.add(content[i].getAbsolutePath());
}
}
}
}if(tasks.size() > 50) {
System.out.printf("%s: %d tasks ran.\n",file.getAbsolutePath(),tasks.size());
}
addResultsFromTasks(list,tasks);returnlist;
}/*** that will add to the list of files
the results returned by the subtasks launched by this task.
*@paramlist
*@paramtasks*/
private void addResultsFromTasks(Listlist,
Listtasks) {for(FolderProcessor item: tasks) {
list.addAll(item.join());
}
}/*** This method compares if the name of a file
passed as a parameter ends with the extension you are looking for
*@paramname
*@return
*/
private booleancheckFile(String name) {returnname.endsWith(extension);
}public static voidmain(String[] args) {
ForkJoinPool pool= newForkJoinPool();
FolderProcessor system= new FolderProcessor("C:\\Windows", "log");
FolderProcessor apps= new FolderProcessor("C:\\Program Files", "log");
pool.execute(system);
pool.execute(apps);
pool.shutdown();
List results = null;
results=system.join();
System.out.printf("System: %d files found.\n",results.size());
results=apps.join();
System.out.printf("Apps: %d files found.\n",results.size());
}
}