Java thread类的start()方法在实现thread类时如何调用子类的run()方法
Java thread类的start()方法在实现thread类时如何调用子类的run()方法,java,multithreading,Java,Multithreading,Thread类的start()方法如何调用实现Thread类的子类的run()方法 我知道当我们实现Runnable时,我们将子类对象传递给线程类构造函数,该构造函数的参数为Runnable。但在另一种情况下,我们调用start()方法,当JVM在子类中找不到start()时,它会转到Thread。现在要调用run(),或将其传递给JVM,我们需要子类引用。线程如何实现它 这是一件有趣的事情 并发是由JVM实现的,但要让它调用子对象的run(),我们需要它的引用或地址。如前所述,Thread.s
Thread
类的start()
方法如何调用实现Thread
类的子类的run()
方法
我知道当我们实现Runnable
时,我们将子类对象传递给线程
类构造函数,该构造函数的参数为Runnable
。但在另一种情况下,我们调用start()
方法,当JVM在子类中找不到start()
时,它会转到Thread
。现在要调用run()
,或将其传递给JVM,我们需要子类引用。线程如何实现它
这是一件有趣的事情
并发是由JVM实现的,但要让它调用子对象的run()
,我们需要它的引用或地址。如前所述,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方法提供,该方法必须直接在线程上实现,或者必须在提供给线程构造函数的可运行对象上实现。如前所述,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方法提供,它必须直接在线程上实现,或者必须在提供给线程构造函数的runnable对象上实现。线程的start()
方法不调用run()
方法。它所做的是创建一个新的操作系统线程,并安排在该新线程中调用run()
方法*
同时,t.start()
可能会在另一个线程进入t.run()
之前返回
*它如何进行这些“安排”在不同的操作系统之间可能完全不同,但一般来说,它涉及进行系统调用并传递指向操作系统将调用的本机函数的指针。本机函数最有可能使用,进入Java库代码,该代码最终将调用t.run()
线程的start()
方法不调用run()
方法。它所做的是创建一个新的操作系统线程,并安排在该新线程中调用run()
方法*
同时,t.start()
可能会在另一个线程进入t.run()
之前返回
*它如何进行这些“安排”在不同的操作系统之间可能完全不同,但一般来说,它涉及进行系统调用并传递指向操作系统将调用的本机函数的指针。本机函数很可能会使用,进入Java库代码,最终将调用t.run()
您可以添加一些代码来显示您的困惑吗?调用Thread.start()
将委托给本机代码,本机代码最终将在新的操作系统线程上调用Thread.run()
。如果在构造线程时传递了Runnable
,该方法将调用Runnable.run()
。如果子类Thread
,则应该重写Thread.run()
。请注意此处的术语。Java实际上没有“子类”的概念。我想你指的是大多数地方的子类。还要注意经常被误用的加载术语“引用”。你需要一个关于类和继承的教程。你能添加一些代码来说明你的困惑吗?调用Thread.start()
将委托给本机代码,本机代码最终将在新的操作系统线程上调用Thread.run()
。如果在构造线程时传递了Runnable
,该方法将调用Runnable.run()
。如果子类Thread
,则应该重写Thread.run()
。请注意此处的术语。Java实际上没有“子类”的概念。我想你指的是大多数地方的子类。还要注意经常被误用的术语“引用”。你需要一本关于类和继承的教程。