1

例如,在 java 中,可以使用实现类Runnable或扩展Thread类来创建线程。我确实理解扩展类,但通过实现接口,JVM 如何决定附加什么。是这种实现纯粹是一种隐式机制,还是我在这里遗漏了一些东西。

编辑:相同的概念是当我们创建对象时Map map=new HashMap(),它如何保持它包含哈希图对象。信息是存储在对象还是引用中。JVM如何看待它?

4

2 回答 2

1

是这种实现纯粹是一种隐式机制,还是我在这里遗漏了一些东西。

线程不是通过实现的行为隐式创建的Runnable。这种对象的实例必须显式传递给Thread构造函数:

new Thread(myRunnable);

显然,Thread实例会毫不费力地确定Runnable调用哪个。

于 2013-08-26T09:19:13.823 回答
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();
  }
}

因此,Case:1 即扩展 Thread 类在这里基本上您将覆盖 Thread.class 的 run() 方法,因此在调用 start() 时,本机 start0() 方法从底层操作系统创建新线程并调用被覆盖的运行()方法。

案例:2 即实现 Runnable 接口 这里您将设置 Runnable 实现对象为目标。因此,在调用 start() 时,本机 start0() 方法从底层操作系统创建新线程并调用 Thread.class 的 run() 方法,如您所见,它将调用 target.run() 即您的 Runnable实现对象的 run() 方法。

于 2013-08-26T09:39:09.373 回答