java - 在 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;
}
提前致谢!
解决方案
您可以创建一个实现的类
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());
}
}
}
推荐阅读
- java - 元素类型“uses-permission”必须后跟属性规范,“>”或“/>”
- time-series - ETT数据集旁边的这个数字(24、28、168、336 ...)是什么意思?
- javascript - 如何为多个域名开启拍卖和发送投标?
- python - 创建依赖于另一个列表的列表
- javascript - 无法使用 React 捕获表单提交时的复选框值
- c# - 我可以在 XAML 代码中使用 C# 后端代码中的变量更改/绑定 HorizontalOptions 的值吗?
- java - 对 ThreadLocal 操作的性能影响
- laravel - 检查 laravel 刀片组件中的 $slot 是否为空
- python - “NameError: name 'insert' is not defined” 当我尝试在方法中使用递归时
- flutter - 底部溢出像素