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实际上没有“子类”的概念。我想你指的是大多数地方的子类。还要注意经常被误用的术语“引用”。你需要一本关于类和继承的教程。