我对Java 7并发和并行功能 - Fork / Join Framework。
表示不满我正在尝试显示给定路径下的所有目录的列表。有人可以告诉我,我是否正确吗?
这是我的主要课程 - 开始任务的JoinForkExample
package com.skilledmonster.examples;
import java.io.File;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
public class JoinForkExample {
public static void main(String[] args) {
ForkJoinPool forkJoinPool = new ForkJoinPool() ;
List<File> directories = forkJoinPool.invoke(new DirectoryListingTask(new File("C:/xampp"))) ;
for (int i = 0; i < directories.size(); i++) {
File file = (File) directories.get(i);
System.out.println(file.getAbsolutePath());
}
}
}
这是我的实际任务
package com.skilledmonster.examples;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.RecursiveTask;
public class DirectoryListingTask extends RecursiveTask<List<File>> {
private static final FileFilter filter = new DirectoryFilter();
private File file ;
public DirectoryListingTask(File file) {
this.file = file;
}
@Override
protected List<File> compute() {
List<RecursiveTask<List<File>>> forks = new LinkedList<>();
List files = new ArrayList();
if (file.isDirectory()) {
File[] filteredFiles = file.listFiles(filter);
if (null != filteredFiles) {
files.addAll(Arrays.asList(filteredFiles));
}
for (File childFile : file.listFiles()) {
DirectoryListingTask task = new DirectoryListingTask(childFile);
forks.add(task);
task.fork();
}
for (RecursiveTask<List<File>> task : forks) {
files.addAll(task.join());
}
}
return files ;
}
}
我几乎得到了预期的结果。但我不确定我是否做对了。令人惊讶的是,即使我在不使用join / fork框架的情况下执行相同的操作,我也没有注意到执行的任何时间差异。
任何想法!
答案 0 :(得分:3)
由于这项工作主要是IO绑定的,因此在这里使用Fork / Join并不是很有帮助。我建议尝试一些计算密集型任务。另请注意,Fork / Join操作有开销。如果你用它来计算Fibonacchi系列,它就不值得。我希望性能比顺序版慢。