2010-06-29 2 views
5

Я пытался использовать метод java threading для isAlive(). Но я обнаружил, что метод isAlive() возвращает false, даже если поток уже запущен. Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно? Вот фрагмент кода.isAlive() метод java thread работает неправильно?

package app; 

public class ThreadAliveDemo { 

    public static void main(String[] args) { 

     Thread myThread; 

     myThread = new Thread() 
     { 
      public void run() 
      { 
          Thread.sleep(3000); 
       System.out.println("My Thread."); 
      } 
     }; 

     myThread.setName("My Thread"); 
     myThread.start(); 

     if(!myThread.isAlive()) 
     { 
      myThread.setName("My Thread"); 
      myThread.start(); 
     } 

    } 

} 
+1

use Thread.getState() вместо этого предоставляет дополнительную информацию. начинать нить дважды не имеет никакого эффекта. – bestsss

+0

Что касается совета @bestsss: книга Брайана Гетца, Java Concurrency in Practice, говорит: «Результат Thread.getState не должен использоваться для контроля параллелизма и имеет ограниченную полезность для тестирования. Основная утилита является источником отладки Информация." – WoodenKitty

+0

@WoodenKitty, в то время как поток не был запущен getState() будет стабильным (может потребоваться некоторая синхронизация с запуском потока). Совет Goetz очень прочный, но в этом случае он неприменим. – bestsss

ответ

3

Если моя память служит мне хорошо, у java есть довольно длительные периоды между переключением потоков, поэтому возможно, что isAlive терпит неудачу, потому что поток еще не жив. Попробуйте добавить некоторое время ожидания между thread.start() и thread.isAlive()

+0

Я пробовал делать нить сна в течение 3 секунд, но получал ту же проблему. – Rise

+0

попробуйте сделать вызывающую нить сна второй (_and_ let, чтобы дочерняя нить не спала 3 секунды). – dbemerlin

+0

он отлично поработал .. Большое спасибо. – Rise

10

Там хороший шанс, что нить будет запущена, выполнена, и закончил, между вызовом start() и ваш призыв к isAlive().

Java не дает гарантий относительно последовательности, в которой происходят эти вещи. Он может немедленно выполнить порожденный поток, или он может отложить его до конца позже.

Кстати, ваш код пытается перезапустить поток после его смерти. Это not permitted:

Он никогда не законно начать нить более чем один раз. В частности, поток не может быть перезапущен после того, как он завершил выполнение .

Так что вызов start() после проверки isAlive() никогда не будет работать.

+0

Да ... Мне нужно обернуть «синхронизированный» блок вокруг моего мозга и моих пальцев. – skaffman

+1

Нет, я попытался использовать Thread.sleep (3000); вызов внутри метода запуска. Тем не менее, я получаю ту же проблему. – Rise

+0

Но как получилось? Я сделал свою нить в течение 3 секунд. а затем проверили вызов isAlive(). И я думаю, что в этом случае вызов isAlive() должен возвращать true, но он все равно возвращает истинный результат. – Rise

1

Я еще не делал многопоточности в java, но мне кажется, что ваш поток, вероятно, запустится и выйдет до проверки isAlive(). В конце концов, похоже, что ваш поток только что-то распечатывает, а затем умирает.

1

Я не вижу смысла кода, который вы опубликовали. Thread.start() запускает поток: вам не нужно запускать его дважды. Я не вижу, как ваш код может реально возникнуть в ситуации, когда у него есть Thread, и не знает, было ли оно запущено или нет; во всяком случае, существует множество способов кодирования кода, чтобы этого не произошло.

+1

Речь идет не о том, как использовать код, как в реальной жизненной ситуации, а в том, чтобы сделать концепцию понятной. – Rise

+0

Но все это означает, что поток фактически не запускается, когда start() возвращает. Это асинхронно. Я не понимаю, какая концепция проиллюстрирована. – EJP

Смежные вопросы