2013-12-12 7 views
1

Я пытался найти причину, по которой «выполнить» печатается только один раз. Но я не мог найти ответ в книге, которую я действительно читаю, Java Threads или googling.run() on terminated state thread

public void init(){ 
    t = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      System.out.println("executed"); 
     } 
    }); 
    t.start(); 
    while(true){ 
     if(!t.isAlive()) 
      t.run(); 
    } 
} 

ответ

4

Глядя на исходный код JDK, вот определение Thread.run():

public void run() { 
    if (target != null) { 
     target.run(); 
    } 
} 

При запуске нить с Runnable он получает набор, как target. Но когда поток завершается работает, система вызывает exit() на нем, которые, помимо всего прочего, делает:

target = null; 

Так один "executed" вы видите, от самого Thread; к моменту вашего звонка run() в теме, target был аннулирован, а run() ничего не делает.

+0

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

+0

@ Николас, потому что ты делаешь ерунду в своем примере, это трудно сказать. Я не понимаю, чего вы пытаетесь достичь. Вы хотите выполнить 'run' один раз в параллельном потоке и в другое время в основном (родительском) потоке? BTW, существует метод 'thread.join()', чтобы ждать unitl другого потока, завершенного. Использование 'isAlive()' в busy-wait не должно использоваться в производственном коде. – Val

+0

@Val Я только пытаюсь понять, как работают потоки. Я только начал заниматься темой – Nicolas