2014-03-18 33 views
0

爲什麼MyThread的運行方法調用如果我傳遞MyRunnable來創建線程。但是如果我使用Thread類,我的結果是不同的。下面是使我困惑的代碼。 請給任何輸入。MyRunnable中的運行方法未調用

public class ThreadDemo { 

    public static void main(String[] args) 
     { 
      new Thread(new MyRunnable()).start(); 
      new MyThread().start(); 
      new MyThread(new MyRunnable()).start(); 
     } 

} 

class MyThread extends Thread 
{ 
    MyThread() {} 
    MyThread(Runnable r) {super(r); } 
    public void run() 
    { 
     System.out.print(" Inside Thread "); 
    } 
} 
class MyRunnable implements Runnable 
{ 
    public void run() 
    { 
     System.out.print(" Inside Runnable"); 
    } 
} 

回答

4

MyThread.run()方法是壓倒Thread.run() - 和它的Thread.run()實現其呼籲Runnablerun方法傳遞到構造函數。 As documented

如果此線程是使用單獨的Runnable運行對象構造的,那麼將調用該Runnable對象的run方法;否則,此方法不做任何事情並返回。

如果您改變MyThread.run()方法:

@Override 
public void run() 
{ 
    System.out.print(" Inside Thread "); 
    super.run(); 
} 

...它將如果你修剪main方法打印「穿過」,那麼「內部可運行」爲最終調用,即只是

new MyThread(new MyRunnable()).start(); 

結果將是

Inside Thread 
    Inside Runnable 
+0

那麼,打印行的順序是依賴於系統的。 –

+0

@KodeCharlie:我不明白。請記住,這是在一個單獨的線程中 - 當「MyRunnable.run()'方法僅在* MyThread.run()打印*」內部Runnable「後被調用時,它如何首先打印」Inside Runnable「 ? –

+0

單線程?我不明白你的意思。有4個線程 - 主線程和三個從main啓動的線程。首先打印的是系統如何執行線程的人爲因素 - 除非給予所述線程明確的優先級。我錯過了什麼嗎? –