2013-09-25 46 views
2

我有以下Java程序:說明對線程

public class A extends Thread { 
    int count; 

    @Override 
    public void run() { 
     while (true) 
      count++; 
    } 

    public static void main(String...strings){ 
     A obj = new A(); 
     obj.start(); 
     System.out.println("The value of count is " + obj.count); 
    } 
} 

當運行該程序的輸出是:The value of count is 0(和程序保持運行)。就我對線程的理解而言,它應該在無限循環中運行,並且從不打印0.任何人都可以幫助我理解此程序的性質。

+0

如何爲打印添加循環?不能保證增加計數的線程將在sysout之前被執行。但是,如果您在此處添加循環,則可能會看到計數增加。 – porfiriopartida

回答

4

線程幾乎在System.out.println運行的同一時間開始,由於線程是後臺,println不會等待它運行,因此您會看到count的初始值。

另外,count變量應該聲明爲volatile,以確保主線程sees changes to the variable在循環線程中產生。

+0

非常感謝你的解釋,我不知道爲什麼我認爲Main正在調用run,並且在控制返回之前它不會運行system.out。 – Ashish

+0

@Ashish:控制將有*從未*返回到主。 –

+0

是的,先生,我明白你的觀點。對不起,這樣一個愚蠢的錯誤,非常感謝你的幫助 – Ashish

1

「線程」沒有執行打印,您的主要是。你期望發生什麼?

您還應該使用某種保護,以便兩個線程都可以安全地訪問該變量。

+0

這裏真的不需要「保護」,因爲只有一個線程正在修改計數。當前的代碼沒有機會出現比賽或鎖定。儘管爲了防止主線程複製它,該變量應該被聲明爲volatile。 –

0

System.out調用不會只運行一次嗎?

我會把System.out.println調用放在while循環中。

對於count,使用getter/setter方法可能會更好,並確保在任何給定時間只有其中一方能訪問變量。