【问题标题】:I can't add JLabel to the collection. Why HashSet size is still 0?我无法将 JLabel 添加到集合中。为什么HashSet大小还是0?
【发布时间】:2018-06-17 10:18:22
【问题描述】:

我无法将 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?

【问题讨论】:

    标签: java multithreading collections


    【解决方案1】:

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

    1. 到那个时间点子线程实际上还没有启动。
    2. 子线程已启动,但(无限!)循环找不到要添加到集合中的任何内容;例如listOfFiles 为空。

    但是您的代码还有其他问题:

    1. 为什么在无限循环中反复为同一组文件添加标签?
    2. 我看不出在这里使用子线程有什么意义,尤其是因为您不想在集合被填充之前从startCheckedFiles() 返回。
    3. 编写的代码不是线程安全的。子线程正在更新HashSet,而父线程正在查看集合的大小...没有进行任何同步。并且(大概)startCheckedFiles() 的调用者也会这样做。这是“发生不可预测的事情”的秘诀。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-19
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-07
      • 2013-09-19
      相关资源
      最近更新 更多