ForkJoin查询文件目录

Fork/Join查找制定文件下文件后缀

基本思想

Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。

分治法:把一个规模大的问题划分为规模较小的子问题,然后分而治之,最后合并子问题的解得到原问题的解。

步骤:

  1. 分割原问题;
  2. 求解子问题;
  3. 合并子问题的解为原问题的解。
    在分治法中,子问题一般是相互独立的,因此,经常通过递归调用算法来求解子问题。

基于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:/");
    }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Fork/Join框架在Java中主要用于并行执行任务,而不是直接用于查询数据库。然而,你可以使用Fork/Join框架来并行执行多个数据库查询任务,并将它们的结果汇总起来。下面是一个示例代码,展示了如何使用Fork/Join框架并行查询数据库: ```java import java.util.ArrayList; import java.util.List; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveTask; public class DatabaseQueryTask extends RecursiveTask<List<String>> { private List<String> databases; public DatabaseQueryTask(List<String> databases) { this.databases = databases; } @Override protected List<String> compute() { if (databases.size() <= 1) { // 如果只有一个数据库,直接查询并返回结果 return queryDatabase(databases.get(0)); } else { // 将任务切分成更小的子任务 int mid = databases.size() / 2; DatabaseQueryTask leftTask = new DatabaseQueryTask(databases.subList(0, mid)); DatabaseQueryTask rightTask = new DatabaseQueryTask(databases.subList(mid, databases.size())); // 并行执行子任务 leftTask.fork(); rightTask.fork(); // 合并子任务的结果 List<String> leftResult = leftTask.join(); List<String> rightResult = rightTask.join(); leftResult.addAll(rightResult); return leftResult; } } private List<String> queryDatabase(String database) { // 执行数据库查询操作,并返回结果 // 这里只是一个示例,你需要根据具体的数据库类型和查询语句来实现查询操作 List<String> result = new ArrayList<>(); // 执行数据库查询操作... return result; } public static void main(String[] args) { List<String> databases = new ArrayList<>(); databases.add("database1"); databases.add("database2"); databases.add("database3"); ForkJoinPool forkJoinPool = new ForkJoinPool(); DatabaseQueryTask task = new DatabaseQueryTask(databases); List<String> result = forkJoinPool.invoke(task); // 处理查询结果 for (String data : result) { System.out.println(data); } } } ``` 在上面的示例中,我们创建了一个`DatabaseQueryTask`类,继承自`RecursiveTask`,并重写了`compute()`方法来执行数据库查询任务。如果数据库数量大于1,我们将任务切分成更小的子任务,并使用`fork()`方法并行执行子任务。最后,我们使用`join()`方法合并子任务的结果,并返回最终的查询结果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值