Потоки не сохраняются последовательно в наборе - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь добавить в набор 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, потоки каждый раз перемешиваются.

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Hashset не поддерживает порядок, как упоминалось zlaval - вы можете использовать LinkedList или ArrayList.

Но если вы хотите избежать дубликатов, а также поддерживать порядок вставки, вы можете использовать

LinkedHashSet

Из документов:

Ha sh реализация таблицы и связанного списка интерфейса Set с предсказуемым порядком итераций. Эта реализация отличается от HashSet тем, что поддерживает двусвязный список, проходящий через все его записи. Этот связанный список определяет порядок итераций, то есть порядок, в котором элементы были вставлены в набор (порядок вставки)

1 голос
/ 14 июля 2020

Согласно документации HashSet

Этот класс реализует интерфейс Set, поддерживаемый таблицей ha sh (фактически, экземпляром HashMap). Он не дает никаких гарантий относительно порядка итерации набора; в частности, это не гарантирует, что порядок останется неизменным с течением времени. Этот класс разрешает нулевой элемент.

Если вы хотите сохранить элементы в порядке вставки, вы можете использовать, например, ArrayList или LinkedList.

...