如何在主线程中显示一个由最后一个启动的线程递增的整数?

时间:2016-07-06 16:18:29

标签: java multithreading wait notify

我写了一个小程序,允许用户在目录中查找文件。该函数是递归的,每个交叉目录由新线程处理。每个线程递增一个整数,它计算交叉目录的数量。

找到文件后,所有这些线程都是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() + " !");
                    }
                }
            }
        }
    }
}

0 个答案:

没有答案