2015-09-18 102 views
-3

我有下面的類行爲螺紋通過擴展Thread類

public class Thread1 extends Thread { 
    @Override 
    public void run() { 
    System.out.println("I am the first thread"); 
    } 

public static void main(String args[]) { 
    Thread1 t = new Thread1(); 
    t.start(); 
} 

}

如果我運行上面的程序,將在新的線程立即打印

"I am the first thread" 

主如果我嘗試兩次啓動相同的線程它會拋出java.lang.IllegalThreadStateException

否瓦特我將通過重寫start()方法

public class Thread1 extends Thread { 
    @Override 
    public void run() { 
    System.out.println("I am the first thread"); 
    } 

    @Override 
    public void start() { 
    System.out.println("I am the Start"); 
    } 

    public static void main(String args[]) { 
    Thread1 t = new Thread1(); 
    t.start(); 
    t.start(); 
    } 
    } 

現在,如果我調用start()方法重寫爲下面的線程1類兩倍的輸出將是

I am in start 
    I am in start 

上述程序是拋出的任何異常。任何人都可以解釋我這種行爲。爲什麼它不啓動新的線程。似乎是簡單但不能理解它。

+3

你覺得'線程'的'start'實現了什麼?如果你重寫它,你期望會發生什麼?你爲什麼這麼認爲? –

+0

閱讀文檔:http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#start-- –

+0

嘗試在你重寫的方法中調用'super.start()'並且看到怎麼了。 – DoubleDouble

回答

1

@Override方法,你正在創建的新方法是什麼將被稱爲,而不是以前的方法

在類Thread,start()是一個做一些東西,並啓動線程的方法。

在你的新類Thread1start()是剛剛打印出一條線,沒有別的方法


你的理解是正確的 - 即調用super.start()是調用父類的版本start()這是允許線程真正開始運行。

但請注意,在嘗試運行兩次時仍然會遇到該異常。這是Thread的設計方式。

從對問題的評論鏈接:

這是從來沒有的法律,以啓動一個線程不止一次。特別是,線程一旦完成執行就不會重新啓動。