在java中,例如,可以使用实现Runnable
或扩展Thread
类来创建线程。我确实理解扩展类,但是通过实现接口,JVM如何决定要附加什么。是这样的实现纯粹是一种隐含的机制,还是我在这里遗漏了一些东西。
编辑:同样的概念是我们创建对象Map map=new HashMap()
,而不是它如何维护它包含hashmap对象。信息是存储在对象还是引用中。 JVM如何看待它?
答案 0 :(得分:1)
这样的实现是纯粹的隐式机制还是我在这里遗漏了一些东西。
仅通过实施Runnable
的行为隐式创建一个线程 。必须将此类对象的实例显式传递给Thread
构造函数:
new Thread(myRunnable);
显然,Thread
实例不会弄清楚Runnable
要调用的内容。
答案 1 :(得分: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接口 在这里,您将Runnable实现对象设置为target。因此,在调用start()时,本机start0()方法从底层操作系统创建新线程并调用Thread.class的run()方法,如您所见,它将调用target.run()即您的Runnable实现Object的run()方法。