Helpers - компьютеры, интернет, программирование

Как попробовать запустить один поток из нескольких других потоков, java

Я написал это в своей функции:

if(myThread.isAlive()) {
} else {
myThread.start();
}

но это небезопасно, если многие потоки вызывают эту функцию одновременно. запуск работающего потока вызывает исключение.

Итак, кроме использования try-catch, есть ли у меня другие варианты?


  • Если вы не планируете ничего делать, пока нить жива, просто не результат if(!myThread.isAlive()) {myThread.start();} 11.05.2011
  • @unholysampler, это НЕ будет работать без синхронизации в потоке 12.05.2011
  • @bestsss: Конечно. Вот почему я просто разместил это как комментарий, он вообще не касается вопроса. 12.05.2011

Ответы:


1

Сделайте этот метод синхронизированным. Кроме того, эта проверка (isAlive()) небезопасна, потому что, если поток был завершен, вы не можете запустить его снова (и isAlive() вернет false...)

11.05.2011
  • Ага. thead всегда воссоздается, когда поток заканчивается. это не проблема. и моя цель не в том, чтобы сделать этот метод синхронизированным, потому что я хочу, чтобы другие потоки вызывали его одновременно. 11.05.2011
  • @karl - мне трудно понять причину, по которой вы хотите получить доступ к какому-либо объекту (не обязательно к потоку) более чем к потоку одновременно, это рецепт проблем. И я думаю, что вы можете перезапустить поток, как только он закончится. Это должно вызвать IllegalStateException. Вместо этого я бы создал новую тему. 11.05.2011
  • if(myThread.isAlive()) { } else { synchronized(thread) { if(thread.getState() == Thread.State.NEW) thread.start(); } } ---› это мое решение. спасибо, хотя. 11.05.2011
  • @karl - почти то же, что я имел в виду, но проверка isAlive не нужна, поскольку thread.getState() охватывает и этот случай. Удачи! 11.05.2011
  • @karl - в ТАК, если вы получаете ответ, который хорошо отвечает на ваш вопрос, вы отмечаете его как принятый (галочка слева от ответа), если один из ответов вас удовлетворил (либо ответ Петра, Антония, либо мой), пожалуйста, отметьте его как принято, чтобы люди не подумали, что вы все еще ищете ответ. 11.05.2011
  • самый простой и надежный способ - полагаться на IllegalThreadStateException, а не на состояние и не isAvile 12.05.2011

  • 2

    Я бы создал тему только тогда, когда собираюсь ее начать.

    Что вы можете сделать, это

    synchronized(thread) {
        if(thread.getState() == Thread.State.NEW)
            thread.start();
    }
    

    Завершившийся поток не будет активен, но его нельзя будет перезапустить.

    11.05.2011

    3

    Использовать синхронизированный метод/блок? Использовать блокировки?

    11.05.2011

    4

    вопреки тому, что все могут сказать: не используйте isAvile() или getState(), оба требуют их выполнения в синхронизации. блокировать с помощью thread.start() и требует, чтобы поток фактически использовал себя в качестве монитора (де-факто он так и делает)

    вместо этого просто поймайте исключение (IllegalThreadStateException) start() и проигнорируйте его.

    try{
      thread.start()
    }catch(IllegalThreadStateException _x){
    //ignore or log the reason, use getState(), if need be
    }
    
    11.05.2011
    Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

    Почему объяснимость так важна прямо сейчас?
    По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..