2012-01-21 1 views
4

В Java Параллелизм на практике есть пример, который заставил меня путать:Странное поведение в Java параллелизм не используя синхронизацию

public class Novisibility { 
    private static boolean ready; 
    private static int number; 

    private static class ReaderThread implements Runnable { 

     public void run() { 
      while (!ready) { 
       Thread.yield(); 
      } 
      System.out.println(number); 
     } 
    } 

    public static void main(String[] args) { 
     System.out.println("0"); 
     new Thread(new ReaderThread()).run(); 
     System.out.println("1"); 
     number = 42; 
     System.out.println("2"); 
     ready = true; 
     System.out.println("3"); 
    } 
} 

Я могу понять, переназначения делает петлю, никогда не разорвать, но я не могу понять, почему «1», «2» и «3» никогда не печатаются на консоли. Может ли любой орган помочь?

ответ

7

Вы не создаете новый поток, а запускаете его в текущем. Вместо этого используйте метод start().

Поскольку вы выполняете run() в основной теме, и этот метод работает в бесконечном цикле, вы никогда не достигнете заявлений System.out.println() (и вы не достигнете ready = true;).

Из JavaDoc на run():

Если эта нить была построена с использованием отдельного объекта Runnable запуска, то метод запуска этого Runnable объекта вызывается; в противном случае этот метод ничего не делает и возвращает.

И start():

Причины этой нити, чтобы начать выполнение; виртуальная машина Java вызывает метод запуска этого потока.

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