2014-10-08 60 views
0

這裏我創建了Main類,在它內部一個線程t1已經通過發送一個可運行的目標開始。但是由於線程已經啓動,我相信run()方法應該運行並調用一個.SetI(20)方法。但輸出結果爲0.可能somone請讓我知道這背後的邏輯。在一個線程中調用run方法

public class _216 { 

    private int i; 

    public synchronized void setI(int i){ 
    this.i=i; 
    } 
    public synchronized int getI(){ 
    return i; 
    } 


} 

class Main{ 
    public static void main(String[] args) { 
     final _216 a=new _216(); 
     Runnable r=new Runnable(){ 

      @Override 
      public void run() { 

      a.setI(20); 
      } 

     }; 
     Thread t1=new Thread(r); 
     t1.start(); 

     System.out.println(a.getI()); 
    } 
} 

回答

2

'這背後的邏輯'是當你打印時線程可能還沒有執行。

+0

Ahh oki我知道了,但有沒有可能得到輸出爲20? – user3789200 2014-10-08 03:17:31

+0

當然,先調用't1.join()',但如果你想要順序執行,爲什麼你要使用一個線程? – EJP 2014-10-08 03:26:16

1

您應該使用t1.join(),以便主線程和此新線程都將加入,並且以後的代碼將繼續打印。

這裏

Thread t1=new Thread(r); 
t1.start(); 
t1.join() 

    System.out.println(a.getI()); 
1

你非常好,可以打印結果的線程完成運行前。

在那時,線程可能會同時運行。

也認識到我從來沒有初始化,直到你調用setI,考慮硬編碼的默認值。

相關問題