Как "попробовать запустить" один поток из нескольких других потоков, Java - PullRequest
1 голос
/ 11 мая 2011

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

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

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

Так что, кроме размещения try-catch, у меня есть другие варианты?

Ответы [ 4 ]

3 голосов
/ 11 мая 2011

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

1 голос
/ 11 мая 2011

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

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

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

Завершенный поток не будет живым, но не может бытьretstarted.

0 голосов
/ 12 мая 2011

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

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

try{
  thread.start()
}catch(IllegalThreadStateException _x){
//ignore or log the reason, use getState(), if need be
}
0 голосов
/ 11 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...