首页 > 解决方案 > 在 Java 中递归查找时的线程

问题描述

我正在尝试创建一个图形浏览器来学习,现在我正在使用搜索器,但是出现了一些我无法解决的问题。

主程序在等待搜索结束时冻结。我该如何解决这个问题?我想要的是在后台完成搜索时继续运行的主程序。

我想问的另一件事是,我正在创建一个线程,但它真的很慢,我想创建几个并行工作的线程,因此搜索所有内容所需的时间更少(但同时线程的限制所以它不会消​​耗太多的处理能力)。

这是我的代码

FilenameFilter textoFiltrado = new FilenameFilter() {
 @Override
 public boolean accept(File dir, String name) {
      String lowercaseName = name.toLowerCase();
      return StringUtils.containsIgnoreCase(lowercaseName, nombreBuscado);
  }
};

ArrayList<File> archivos = new ArrayList();
Thread buscar = new Thread(new Runnable() {
@Override
public void run() {
   buscador.setEnabled(false);
   archivos.addAll(u.busqueda(new File(ruta), textoFiltrado, true));
}

});

buscar.start();
buscar.join();

这是被调用的方法

public static Collection busqueda(File directory, FilenameFilter filter, boolean recurse) {

Vector files = new Vector();

File[] entries = directory.listFiles();

for (File entry : entries) {

    String s = entry.getName();

    if (s.indexOf(".") > 0) {

        s = s.substring(0, s.lastIndexOf("."));

    }

    if (filter == null || filter.accept(directory, s)) {
        files.add(entry);
    }


    if (recurse && entry.isDirectory()) {
        files.addAll(busqueda(entry, filter, recurse));
    }
}

return files;
}

提前致谢!

标签: javamultithreading

解决方案


您可以创建一个实现的类

Callable<Vector<File>>

如...

import java.io.File;
import java.util.Vector;
import java.util.concurrent.Callable;

public class ThreadFiles implements Callable<Vector<File>> {

    @Override
    public Vector<File> call() throws Exception {
        File[] files = new File("C:/PathToFiles").listFiles();
        Vector<File> vectorFiles = new Vector<File>();

        for (File file : files) {
            vectorFiles.add(file);
        }
        return vectorFiles; 
    }
}

然后在调用该类时从线程评估您的文件:

import java.io.File;
import java.util.Vector;

public class CallThreadFiles {

    public static void main (String[] args) {

        final ThreadFiles  task = new ThreadFiles();                
        Vector<File> files = null;

        try {
            files = task.call();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        for (File f: files) {
            System.out.println(f.getName());            
        }

    }
}

推荐阅读