在java中,例如可以使用Runnable
或擴展Thread
類來創建線程。我明白擴展類,但通過實現接口JVM如何決定附加它。難道這樣的實現純粹是一種隱含的機制,或者我在這裏錯過了一些東西。接口隱式機制
編輯:同樣的概念是,當我們創建對象爲Map map=new HashMap()
,而不是它如何保持它包含hashmap對象。信息存儲在對象或引用中。 JVM如何看待它?
在java中,例如可以使用Runnable
或擴展Thread
類來創建線程。我明白擴展類,但通過實現接口JVM如何決定附加它。難道這樣的實現純粹是一種隱含的機制,或者我在這裏錯過了一些東西。接口隱式機制
編輯:同樣的概念是,當我們創建對象爲Map map=new HashMap()
,而不是它如何保持它包含hashmap對象。信息存儲在對象或引用中。 JVM如何看待它?
是這樣的實現是純粹的隱式機制還是我在這裏丟失了一些東西。
線程是不只是通過實施Runnable
的行爲隱式創建。這樣的對象的實例必須明確傳遞到Thread
構造:
new Thread(myRunnable);
顯然,Thread
實例將打破無汗搞清楚這Runnable
打電話。
如果你可以看到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()方法。
重複的:http://stackoverflow.com/questions/541487/implements-runnable-vs-extends-thread –
'類Thread實現Runnable' ... –
我知道,但是在JVM中發生了什麼?建議的鏈接更多地使用和區別。 – Rorschach