我无法将JLabel添加到集合中。为什么HashSet大小仍为0?

时间:2018-06-17 10:18:22

标签: java multithreading collections

我无法将JLabel添加到集合中。 listOfFiles == 3个不同的文件。 System.out.println(set.size())仍返回0.

public HashSet<JLabel> startCheckedFiles(){
        HashSet <JLabel> set = new HashSet<>();
        File folder = new File("utwory\\");
        File[] listOfFiles = folder.listFiles();

        final Runnable r = new Runnable() {
            public void run() {
                while(1==1) {
                    for (int i = 0; i < listOfFiles.length; i++) {
                        if (listOfFiles[i].isFile()) {
                            set.add(new JLabel(listOfFiles[i].getName())); //listOfFiles == 3 diffrent files
                        }
                    }
                }
            }
        };
        final Thread t = new Thread(r);
        t.start();
        System.out.println(set.size()); // return 0
        return set;
    }

为什么HashSet大小仍为0?

1 个答案:

答案 0 :(得分:0)

System.out.println(set.size())打印零可能有两个原因:

  1. 子线程实际上并未在该时间点启动。
  2. 子线程已经启动,但是(无限!)循环找不到要添加到集合中的任何内容;例如listOfFiles是空的。
  3. 但您的代码还存在其他问题:

    1. 为什么在无限循环中为同一组文件重复标记?
    2. 我在这里没有看到使用子线程的重点,特别是因为您不想从startCheckedFiles()返回,直到设置已填充为止。
    3. 编写的代码不是线程安全的。子线程正在更新HashSet,并且父线程正在查看集合的大小... 而不进行任何同步。而且(大概)startCheckedFiles()的来电者也会这样做。这是&#34;不可预测事情发生的一个秘诀&#34;。