2013-08-26 42 views
1

在java中,例如可以使用Runnable或擴展Thread類來創建線程。我明白擴展類,但通過實現接口JVM如何決定附加它。難道這樣的實現純粹是一種隱含的機制,或者我在這裏錯過了一些東西。接口隱式機制

編輯:同樣的概念是,當我們創建對象爲Map map=new HashMap(),而不是它如何保持它包含hashmap對象。信息存儲在對象或引用中。 JVM如何看待它?

+0

重複的:http://stackoverflow.com/questions/541487/implements-runnable-vs-extends-thread –

+0

'類Thread實現Runnable' ... –

+0

我知道,但是在JVM中發生了什麼?建議的鏈接更多地使用和區別。 – Rorschach

回答

1

是這樣的實現是純粹的隱式機制還是我在這裏丟失了一些東西。

線程是只是通過實施Runnable的行爲隱式創建。這樣的對象的實例必須明確傳遞到Thread構造:

new Thread(myRunnable); 

顯然,Thread實例將打破無汗搞清楚這Runnable打電話。

0

如果你可以看到Thread類的源代碼,你可以理解,即使Thread類本身也實現了Runnable接口。

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Thread.java#Thread.run%28%29 


public More ...Thread() { 
    init(null, null, "Thread-" + nextThreadNum(), 0); 
} 

public More ...Thread(Runnable target) { 
    init(null, target, "Thread-" + nextThreadNum(), 0); 
} 

public synchronized void More ...start() { 
if (threadStatus != 0) 
    throw new IllegalThreadStateException(); 
    group.add(this); 
    start0(); 
    if (stopBeforeStart) { 
     stop0(throwableFromStop); 
    } 
} 

private native void More ...start0(); 

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

所以, 案例:1,即擴展Thread類 這裏基本上是覆蓋Thread.class的run()方法,因此在調用start()方法,本地START0()方法創建來自底層操作系統的新線程並調用重寫的run()方法。

案例:2即實現可運行接口 在這裏,您將設置Runnable實現對象爲目標。因此,在調用start()時,本地start0()方法從底層操作系統創建新的線程並調用Thread.class的run()方法,正如你所看到的,它會調用target.run(),即你的Runnable實現Object的run()方法。