2011-01-14 103 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