2011-01-14 101 views
6

我想在下面的程序中输出100作为输出。如何打印100?

我得到0作为答案。

class s extends Thread{ 
    int j=0; 
     public void run() { 
      try{Thread.sleep(5000);} 
      catch(Exception e){} 
      j=100; 
     } 
     public static void main(String args[]) 
     { 
      s t1=new s(); 
      t1.start(); 
      System.out.println(t1.j); 
     } 

} 
+0

也和纠正我,如果我错了大师,而比直接访问“s”类的变量你应该包含访问器方法来打印j的值。 – 2011-01-14 14:48:31

+0

@牛:这将是一个很好的做法。这里更重要的是同步对`j`的访问(或者声明它是volatile)。即使在`s`线程完成写入后,主线程可能(尽管不太可能)看到`j`的陈旧值。请参阅Brian Goetz的“Java实践中的并发性”一书,以便解释为什么这是真实的。 – 2011-01-14 17:17:50

回答

5

您已将t1加入main。 因此,父母thread(main())将等待子线程完成。

13

你需要等待Thread到finish..I纷纷加入到join你的电话,这将阻止,等待Thread至望着j前值完成:

class s extends Thread{ 
    int j=0; 
    public void run() { 
     try{ Thread.sleep(5000); } catch(Exception e){} 
     j = 100; 
    } 

    public static void main(String args[]) throws InterruptedException { 
     s t1=new s(); 
     t1.start(); 
     t1.join() ; // Wait for t1 to finish 
     System.out.println(t1.j); 
    } 
} 
2

加入T1

t1.join 

,使主线程等待

2

线程T1刚刚加入到主

t1.join