使用fork/join的异步方式遍历某个目录查找指定文件

/*
使用fork/join的异步用法演示不要求返回值
遍历指定的目录,包含了子目录,寻找指定类型的文件
 */
public class FindDirectory {
//    public static List fileList = new ArrayList();


    /*
    不要求返回值的情况
     */
    static class MyTask extends RecursiveAction {
        File dir;//表示进行查询的目录

        public MyTask(File path) {
            this.dir = path;
        }

        @Override
        protected void compute() {
            ArrayList subTaskLists = new ArrayList<>();
            /*
            如果是目录,继续进行拆分
             */
            if (dir != null) {

                if(dir.isDirectory()) {

                    //所有任务的列表

                    //展示目录下面的文件
                    File[] files = dir.listFiles();
                    //有可能外表是一个目录,但是里面却没有一个文件
                    if (files!=null) {
                        for (File file : files) {
                            MyTask subTask = new MyTask(file);
                            subTaskLists.add(subTask);
                        }

                        if (!subTaskLists.isEmpty()) {
                            for (MyTask subTaskList : invokeAll(subTaskLists)) {
                                subTaskList.join();
                            }
                        }
                    }



                }else{
                    //进行筛选
                    boolean matches = dir.getAbsolutePath().endsWith("txt");//判断是不是txt文件
                    if (matches) {
                        System.out.println("文件:"+dir.getName());
                    }

                }
            }

        }
    }


    public static void main(String[] args) {
        ForkJoinPool pool = new ForkJoinPool();
        String path = "D:/";
        File file = new File(path);
        MyTask myTask = new MyTask(file);
        pool.execute(myTask);
        myTask.join();

    }

}


你可能感兴趣的:(使用fork/join的异步方式遍历某个目录查找指定文件)