Java - 调用在线程上启动方法:它如何路由到Runnable接口的run()?

Bha*_*kar 6 java multithreading

好的,我知道创建新线程并在Java中运行它的两种标准方法:

  1. Runnable在类中实现,定义run()方法,并将类的实例传递给新的Thread.当start()上线实例方法被调用时,类实例的run方法被调用.

  2. 让类派生自Thread,因此它可以覆盖该方法run(),然后在start()调用新实例的方法时,将调用路由到重写方法.

在这两种方法中,基本上Thread都会创建一个新对象并调用其start方法.但是,在第二种方法中,调用被路由到用户定义run()方法的机制非常清楚(这是一个简单的运行时多态性),我不明白如何调用start()Thread对象上的方法被路由到run()类实现Runnable接口的方法.Thread该类是否具有Runnable首先检查的类型的私有字段,如果已设置,则在设置为对象时调用run方法?这将是一个奇怪的机制IMO.

如何start()将线程上的调用路由到Runnable类的实现的接口的run方法,该类的对象在构造线程时作为参数传递?

SLa*_*aks 7

Thread保持对参考Runnable实例,并在基实现的调用它run.

你可以在源代码中看到这个:

// passed into the constructor and set in the init() method
private Runnable target;
...
// called from native thread code after start() is called
public void run() {
    if (target != null) {
        target.run();
    }
}
Run Code Online (Sandbox Code Playgroud)