首页 > 解决方案 > 线程未按顺序存储在集合中

问题描述

我正在尝试将 10 个线程添加到一个集合中并按顺序命名它们。但是当我调试查看集合时,线程不是按顺序存储的。有人能告诉我我做错了什么吗?

 Set<Thread> allThreads = new HashSet<Thread>();
        final DemoClass demo = new DemoClass();
    

        for (int i = 0; i < 10; i++) {

            Thread thread = new Thread(new Runnable() {
                public void run() {
                    try {
                        demo.getName();
                    } catch (InterruptedException ie) {
                        System.out.println("We have a problem");
                    }
                }
            });
            thread.setName("Thread_" + (i + 1));
            allThreads.add(thread);
        }

        for (Thread t : allThreads) {
            t.start();
        }

        for (Thread t : allThreads) {
            t.join();
        }
    }

当我看到 allThreads 时,线程每次都是混乱的。

标签: javamultithreadingthreadpoolhashsetreentrantlock

解决方案


根据 HashSet 的文档

该类实现了由哈希表(实际上是 HashMap 实例)支持的 Set 接口。它不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。此类允许空元素。

如果您想保留插入顺序中的元素,您可以使用例如ArrayListLinkedList


推荐阅读