Цикл не завершается при присоединении ко всем другим потокам

1

Прежде всего я искал ответ навсегда. Таким образом, я пытаюсь присоединиться ко всем моим темам:

Set<Thread> threads = Thread.getAllStackTraces().keySet();
try {
    for (Thread t : threads)
    if(t!=Thread.currentThread())
        t.join(5*1000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

Но я застреваю в бесконечном цикле? Я вижу, что потоки заканчиваются, когда я отлаживаю то, что происходит?

Я также пробовал:

Set<Thread> threads = Thread.getAllStackTraces().keySet();
try {
    for (Thread t : threads)
    if(!t.toString().contains("main") || !t.toString().contains("system"))
        t.join(5*1000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

и я получаю те же результаты. помощь будет оценена :)

  • 1
    Что делают темы? Похоже, ваша программа, скорее всего, зашла в тупик ...
  • 1
    Они симулируют некоторую войну:> Я могу сказать, что она отлично работает (и все потоки умирают), если я помещу код в заметки (программа завершается чисто)
Показать ещё 2 комментария
Теги:
multithreading

1 ответ

1
Лучший ответ

Вы ожидаете, что потоки погибнут, которые являются частью JVM, но вы неправильно указали свою логику. Все потоки будут соответствовать условию "не содержит основную или не содержит системы", если только оно не содержит как двух слов. Попробуйте вместо этого использовать &&:

if(!t.toString().contains("main") && !t.toString().contains("system"))

Используя &&, мой процесс существует быстро.

Если вы ожидаете, что потоки умрут, сохраните свой собственный список потоков, которые запускаются в вашей программе, и дождитесь их смерти. Не Thread.getAllStackTraces список из Thread.getAllStackTraces, потому что он будет содержать другие потоки, которые вы не запустили и не умрете первым.

  • 0
    Я смущен! проверяю это прямо сейчас.
  • 0
    Почему тогда не работает первая версия?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню