线程Java应用程序

时间:2017-04-13 18:01:39

标签: java

我必须构建一个 java 应用程序,它使用线程在Directory和SubDirictory中返回pdf文件的名称。 但另外我还要按照字母顺序打印它。 我编写了这段代码,它对每个帖子的结果进行排序,但没有对结局结果进行排序。

public class Pdf extends Thread {

    File f;
    ArrayList<String> a = new ArrayList<>();

    public Pdf(File f, String name) {
        super(name);
        this.f = f;
    }
    ArrayList<String> a1 = new ArrayList<>();

    @Override
    public synchronized void run() {
        for (File file : f.listFiles()) {

            if (file.isFile() && file.getName().contains(".pdf")) {
                if (file.getName().charAt(0) >= 'a' && file.getName().charAt(0) <= 'z') {
                    Collections.sort(a);
                    a.add(file.getName());
                }

            }
            if (file.isDirectory()) {

                new Pdf(file, file.getName()).start();

            }
        }
        Collections.sort(a);
        Collections.reverseOrder();
        for (String l : a) {
            System.out.println(l);
        }
    }
}    

2 个答案:

答案 0 :(得分:2)

如果有目录,则表示您正在创建新的thread。该线程正在计算文件并将其添加到其自己的本地变量列表中。列表按一个线程排序,但由于不同线程有几个不同的列表,因此您无法获得整体排序结果。此外,由于不同的线程将单独运行,因此您可以获得文件名的随机输出。

要克服这个问题,您可以执行以下任一操作。

  1. 如果你使用这样的单独线程,那么使用一个公共并发列表,可以在所有线程完成执行后对其进行排序。
  2. 最好使用单个线程。这里不是为每个子目录创建一个单独的线程,而是创建一个方法,它将在列表中添加文件,并在有子目录时递归调用自身。在这种情况下,在线程结束时,您可以对列表进行排序并打印出来。
  3. 如果您想要反转列表,还需要注意一个不同的注释,那么您必须拨打Collections.reverseOrder(a)

答案 1 :(得分:1)

您将需要一个所有线程都将其结果添加到的集合。确保该集合是同步集合。否则,该集合可能会“破裂”。然后,您必须等到所有线程都完成。一旦它们出现,您必须对它们添加的集合进行排序并返回它。