start()
类的Thread
方法如何调用实现run()
类的子类的Thread
方法?
我知道在实现Runnable
时,我们将子类对象传递给参数为Thread
的{{1}}类构造函数。但是在另一种情况下,我们调用Runnable
方法,并且当JVM在子类中找不到start()
时,它将转到start()
。现在调用Thread
或将其传递给JVM,我们需要子类引用。 run()
如何实现它?
这是一件有趣的事情。
并发是由JVM实现的,但是要让它调用子项的Thread
,我们需要它的引用或地址。
答案 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();
}
}
在这里,runnable
是null
还是创建线程时提供的Runnable
实例。可运行实例的链接是通过提供给线程构造函数的引用进行的,该引用被保存为线程对象的实例值。
键行为由run方法提供,该方法必须直接在线程上实现,或者必须在提供给线程构造函数的可运行对象上实现。