Fork/Join查找制定文件下文件后缀
基本思想
Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。
分治法:把一个规模大的问题划分为规模较小的子问题,然后分而治之,最后合并子问题的解得到原问题的解。
步骤:
- 分割原问题;
- 求解子问题;
- 合并子问题的解为原问题的解。
在分治法中,子问题一般是相互独立的,因此,经常通过递归调用算法来求解子问题。
基于Fork/Join实现指定后缀文件的查找
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveAction;
/**
* @author 尚先生
* @date 2021/9/16 20:50
*/
public class Demos {
private static void findFile(String path){
ForkJoinPool pool = new ForkJoinPool();
File file = new File(path);
MyFileTask myTask = new MyFileTask(file);
pool.execute(myTask);
myTask.join();
}
//RecursiveAction 是无返回结果的ForkJoinTask实现Runnable
//RecursiveTask<V> 有返回结果的ForkJoinTask实现Callable
static class MyFileTask extends RecursiveAction {
File file;
public MyFileTask(File path) {
this.file = path;
}
@Override
protected void compute() {
ArrayList<MyFileTask> subTaskLists = new ArrayList<>();
if (file != null) {
if(file.isDirectory()) {
File[] files = file.listFiles();
if (files!=null) {
Arrays.stream(files).forEach(e->{
MyFileTask subTask = new MyFileTask(e);
subTaskLists.add(subTask);
});
if (!subTaskLists.isEmpty()) invokeAll(subTaskLists).forEach(ForkJoinTask::join);
}
}else{
//查找制定后缀
boolean matches = file.getAbsolutePath().endsWith(".png");
if (matches) {
System.out.println("文件名字:"+file.getName());
}
}
}
}
}
public static void main(String[] args) {
//在此输入要查找的文件夹
findFile("C:/");
}