2012-01-11 54 views
3

我在這裏得到了一個代碼,當它運行它時創建並啓動一個新的線程,每秒打印一個字,5秒後主方法停止線程。所以該程序將打印5個字,它確實......但不在我的家用電腦上,只在我的筆記本電腦上。在我的家用電腦上打印6次,爲什麼?Java使線程同時啓動

public class Main { 
    public static void main (String [] args){ 
    try { 
     T1 t1 = new T1(); 
     System.out.println("Creating and staring thread 1\n"); 
     Thread.sleep(5000); 
     t1.stopThread(); 
    } catch(InterruptedException ie) {} 
    } 
} 

public class T1 extends Thread{ 

    private boolean alive = true; 

    public T1(){ 
    start(); 
    } 

    public void run(){ 
    while(alive){ 
     try { 
     System.out.println("Tråd T1: Tråd 1"); 
     Thread.sleep(1000); 
     } catch(InterruptedException ie) {} 
    } 
    } 
    public void stopThread(){ 
    alive = false; 
    } 
} 

回答

9

很幸運,您的程序完全停止打印。你有一個未定義行爲的程序,它可以在一些機器上永遠運行。您必須製作alivevolatile,否則不能保證您的輔助線程會在主線程中看到對alive所做的更改。

看看Java語言規範chapter on memory的結尾;他們基本上把你的榜樣當作一定不能做的事情。

這就是說,你仍然可以從Thread.sleep的不準確性中得到6行而不是5行。

9

兩個結果都是正確的。睡眠時間是近似的。

+2

看看那些以獲得更好的理解。 http://stackoverflow.com/questions/824110/accurate-sleep-for-java-on-windows - http://www.javatuning.com/why-is-thread-sleep-inherently-inaccurate/ – SHiRKiT 2012-01-11 19:20:04