我写了一个小程序,允许用户在目录中查找文件。该函数是递归的,每个交叉目录由新线程处理。每个线程递增一个整数,它计算交叉目录的数量。
找到文件后,所有这些线程都是interrupted
,但主线程除外。
我想在我的thread-main中显示这个整数,当找到该文件但我不明白我该怎么做。我应该在启动器中使用join
吗?
这是来源。提前谢谢!
FILE:LAUNCHER
public class Launcher {
public static void main(String args[]) {
try {
// Find's launch
Find find = new Find("tests.txt", "C:/Users/xxx/google_drive");
find.start();
// HERE : SHOULD I USE JOIN() ????
System.out.println("Number of crossed-directories " + Find.number_of_dirs);
} catch (InterruptedException e) {
System.out.println(e);
}
}
}
文件:查找
public class Find extends Thread {
private static ArrayList<Find> all_threads = new ArrayList<Find>();
private String file, dir;
protected static int number_of_dirs;
public Find(String file, String dir) {
this.file = file;
this.dir = dir;
synchronized (Find.class) {
Find.all_threads.add(this);
Find.incrementNumberOfDirs();
}
}
private static synchronized void incrementNumberOfDirs() {
Find.number_of_dirs++;
}
public void run() {
this.search(this.dir);
}
public void search(String file_path) {
File file = new File(file_path);
if(file.isDirectory()) {
System.out.println("Searching in the directory... " + file.getAbsolutePath());
for(File found_file : file.listFiles()) {
if(Find.interrupted()) {
synchronized (Find.class) {
Find.all_threads.remove(this);
}
return;
}
if(found_file.isDirectory()) {
Find find = new Find(this.file, found_file.getAbsolutePath());
find.start();
} else {
if(this.file.equals(found_file.getName())) {
Find.all_threads.forEach(thread -> thread.interrupt());
System.out.println("File was found here : " + found_file.getAbsolutePath() + " !");
}
}
}
}
}
}