例如,在 java 中,可以使用实现类Runnable
或扩展Thread
类来创建线程。我确实理解扩展类,但通过实现接口,JVM 如何决定附加什么。是这种实现纯粹是一种隐式机制,还是我在这里遗漏了一些东西。
编辑:相同的概念是当我们创建对象时Map map=new HashMap()
,它如何保持它包含哈希图对象。信息是存储在对象还是引用中。JVM如何看待它?
例如,在 java 中,可以使用实现类Runnable
或扩展Thread
类来创建线程。我确实理解扩展类,但通过实现接口,JVM 如何决定附加什么。是这种实现纯粹是一种隐式机制,还是我在这里遗漏了一些东西。
编辑:相同的概念是当我们创建对象时Map map=new 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();
}
}
因此,Case:1 即扩展 Thread 类在这里基本上您将覆盖 Thread.class 的 run() 方法,因此在调用 start() 时,本机 start0() 方法从底层操作系统创建新线程并调用被覆盖的运行()方法。
案例:2 即实现 Runnable 接口 这里您将设置 Runnable 实现对象为目标。因此,在调用 start() 时,本机 start0() 方法从底层操作系统创建新线程并调用 Thread.class 的 run() 方法,如您所见,它将调用 target.run() 即您的 Runnable实现对象的 run() 方法。