2016-07-04 45 views
0

嗨,我無法找到我得到這個輸出的原因。我知道第一個輸出,但第二行我無法理解。我是線程新手,但我仍然有疑問。有人可以解釋嗎?無法知道這個多線程程序的輸出

輸出是:

Inside ThreadEx 
Inside ThreadEx 

這裏是我的代碼:

class ThreadEx extends Thread{ 

    ThreadEx(){} 

    ThreadEx(Runnable r) 
    { 
     super(r); 
    } 

    public void run() 
    { 
     System.out.println("Inside ThreadEx"); 
    } 
} 

class RunnableEx implements Runnable{ 

    @Override 
    public void run() { 
     System.out.println("Inside RunnableEx "); 
    } 
} 

public class Test4 { 

    public static void main(String[] args) { 

     new ThreadEx().start(); 
     new ThreadEx(new RunnableEx()).start(); 
    } 
} 

回答

2

,因爲你在ThreadEx類中重寫run()方法,它發生。如果您使用

new Thread(new RunnableEx()).start() 

,而不是

new ThreadEx(new RunnableEx()).start() 

,你會看到預期的輸出(我猜的預期輸出爲Inside ThreadEx Inside RunnableEx

0

您覆蓋新語絲「跑」的方法。 最初的「run」方法調用Runnable的「run」方法(這裏:「r」)。 但是你可以覆蓋它,所以它只會叫你「的System.out。......」

原來是

@Override 
public void run() { 
    if (target != null) { 
     target.run(); 
    } 
} 

public void run() 
{ 
    System.out.println("Inside ThreadEx"); 
} 

所以纔有了第二替換無論你的Runnable怎麼說,都會執行一個。

0

Thread類實現Runnable該接口有方法運行,而Thread類爲該方法提供了默認實現。

有關您的代碼 - >

所以main方法的第一行被調用,其延伸Thread Class.It有一個方法運行(ThreadEx類的默認構造函數),這實際上是一個方法Thread supperclass,你可以覆蓋,所以我認爲@Override缺少上面的運行method.Ok,直到這裏。

那麼,你看到

new ThreadEX().start(); 

你在做上面加你開始這個thread.You已經Implemeted一個run()中提到,它會打印「裏面的ThreadX」。主要方法

SECOND LINE - >

主要方法的下一行被調用類ThreadEX給予Runnable對象的第二構造函數。正如你所看到的是提供RunnableEX這是一個實現這個接口的類。它覆蓋了run()方法。所以,當你在這一行啓動線程

new ThreadEx(new RunnableEx()).start(); 

Thread它會打印 '裏面RunnableEX'

有關替代

http://docs.oracle.com/javase/tutorial/java/IandI/override.html