线程类的start()方法在实现线程类时如何调用子类的run()方法

时间:2019-02-20 15:56:50

标签: java multithreading

start()类的Thread方法如何调用实现run()类的子类的Thread方法?

我知道在实现Runnable时,我们将子类对象传递给参数为Thread的{​​{1}}类构造函数。但是在另一种情况下,我们调用Runnable方法,并且当JVM在子类中找不到start()时,它将转到start()。现在调用Thread或将其传递给JVM,我们需要子类引用。 run()如何实现它?

这是一件有趣的事情。

并发是由JVM实现的,但是要让它调用子项的Thread,我们需要它的引用或地址。

2 个答案:

答案 0 :(得分:3)

start()实例的Thread方法不会调用run()方法。它的作用是创建一个新的操作系统线程,并为该新线程中的{em> in 中的run()方法进行安排。*

与此同时,t.start()可能可以在其他线程进入t.run()之前返回。


*如何使这些“安排”从一个操作系统到另一个操作系统可能完全不同,但是通常,它涉及进行系统调用以及将指针传递给OS将要调用的本机函数。本机函数很可能会使用Java Invocation API进入最终会调用t.run()的Java库代码。

答案 1 :(得分:2)

如前所述,Thread.start调用一个本机方法,该方法又调用Thread.run

public synchronized void start() {
    startImpl();
}

private native void startImpl(); 

Thread.run的代码具有:

public void run() {
    if (runnable != null) {
        runnable.run();
    }
}

在这里,runnablenull还是创建线程时提供的Runnable实例。可运行实例的链接是通过提供给线程构造函数的引用进行的,该引用被保存为线程对象的实例值。

键行为由run方法提供,该方法必须直接在线程上实现,或者必须在提供给线程构造函数的可运行对象上实现。