接口隐式机制

时间:2013-08-26 09:04:54

标签: java multithreading

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

编辑:同样的概念是我们创建对象Map map=new HashMap(),而不是它如何维护它包含hashmap对象。信息是存储在对象还是引用中。 JVM如何看待它?

2 个答案:

答案 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()方法。