原创转载请注明出处:https://agilestyle.iteye.com/blog/2442943
start
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法run()称为线程体,它包含了要执行的这个线程的内容,run方法运行结束,此线程随即终止。
start方法源码示例
一个 Java 线程的创建本质上就对应了一个本地线程(native thread)的创建,两者是一一对应的。
关键问题是:本地线程执行的应该是本地代码,而 Java 线程提供的线程函数(run)是 Java 方法,编译出的是 Java 字节码。
所以, Java 线程其实提供了一个统一的线程函数,该线程函数通过 Java 虚拟机调用 Java 线程方法 , 这是通过 Java 本地方法 start0 调用来实现的。
也就是新创建的线程启动调用native start0方法,而这些native方法的注册是在Thread对象初始化的时候完成的
Thread 类有个 registerNatives 本地方法,该方法主要的作用就是注册一些本地方法供 Thread 类使用,如 start0(),stop0() 等等,可以说,所有操作本地线程的本地方法都是由它注册的。
这个方法放在一个 static 语句块中,当该类被加载到 JVM 中的时候,它就会被调用,进而注册相应的本地方法。(查看本地方法的源码需要前往 http://jdk.java.net/java-se-ri/8 下载openjdk的源代码)
而本地方法 registerNatives 是定义在 Thread.c 文件中的。Thread.c 是个很小的文件,它定义了各个操作系统平台都要用到的关于线程的公用数据和操作,如下:
可以看出 Java 线程调用 start->start0 的方法,实际上会调用到 JVM_StartThread 方法,而 JVM_StartThread 最终调用的是 Java 线程的 run 方法。
在 jvm.cpp 中,有如下代码段:
这里 JVM_ENTRY 是一个宏,用来定义 JVM_StartThread 函数,可以看到函数内创建了真正的平台相关的本地线程,其线程函数是 thread_entry,如下:
可以看到调用了 vmSymbols::run_method_name 方法,而 run_method_name 是在 vmSymbols.hpp 用宏定义的:
run
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
run方法源码示例
分别测试start和run
package org.fool.test.thread; public class ThreadTest { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + " invoked..."); } }); thread.start(); //thread.run(); } }
先运行thread.start()
Thread-0 invoked...
注释调thread.start()方法,运行thread.run()
main invoked...
Summary
start方法可启动多线程
run方法只是thread的一个普通方法调用,还是在主线程里执行,是不会开启多线程的
相关推荐
线程中start方法和run方法的区别
在Java多线程编程中,`Thread` 类的 `run()` 方法和 `start()` 方法扮演着不同的角色,它们之间的区别是理解并发执行的关键。 首先,`start()` 方法是真正启动新线程的方法。当你调用 `Thread` 对象的 `start()` ...
`Thread`类是Java中用于创建和管理线程的核心类,而`start()`和`run()`方法是与线程执行密切相关的方法,它们之间存在显著的区别。 首先,`run()`方法是`Runnable`接口或`Thread`类中的一个成员方法。当你需要创建...
### QT线程start()与run()详解 #### 一、QT线程概述 在QT框架中,线程处理是一项非常重要的功能。QT提供了一个跨平台的解决方案——`QThread`类,使得开发者能够轻松地创建多线程应用程序,而无需担心底层操作系统...
Java线程中start和run的区别详解 ...start和run方法之间的区别是非常重要的,start方法用于启动新线程,而run方法用于定义线程的执行体。在实际编程中,我们应该根据需要选择正确的方法,以达到多线程编程的目的。
Java中启动线程start和run的两种方法 Java 中启动线程有两种方法,即继承 Thread 类和实现 Runnable 接口。由于 Java 无法实现多重继承,所以一般通过实现 Runnable 接口来创建线程。但是,无论哪种方法都可以通过 ...
接下来,我们来看`start`和`run`方法的区别。`start`方法是用于启动线程的关键,它是一个同步方法,确保线程不会在未准备好时启动。在`start`方法内部,它首先检查线程的状态,如果线程已经启动或已经终止,就会抛出...
理解和掌握如何正确使用`start`方法和`run`方法对于编写高效的多线程程序至关重要。本文将深入探讨这两个方法的区别,帮助初学者更好地理解Java线程的工作原理。 首先,我们要明确`start`方法和`run`方法在Java线程...
然而,很多开发者对start()方法的原理和实现机制不甚了解,本文将深入探究Java多线程start()方法的原理和实现机制。 为什么启动线程不用run()方法而是使用start()方法? 很多开发者可能会问,为什么启动...
本文主要介绍了JAVA面试题中关于启动线程的start()和run()方法的详解。通过示例代码,详细介绍了这两个方法的作用和区别,以及它们在启动线程时的执行过程。 第一点,start()方法和run()方法的区别。在Java中,...
面试中常见的问题在于理解`start()`方法与`run()`方法的区别。这里我们将详细探讨这两个方法以及它们在Java线程中的作用。 首先,`start()`方法是开启新线程的关键,而`run()`方法则是线程执行的具体任务。当你调用...
`start()`方法不会立即执行`run()`方法,而是将它放入线程的执行队列中,等待JVM调度执行。由于线程的并发性,两个线程可能会交错执行,因此输出结果可能会有不同顺序,但最终加法的结果总和应该为5050。 在多线程...
run()方法是线程执行的主要逻辑,当调用QThread的start()方法时,系统会调用这个方法。例如: ```cpp class MyThread : public QThread { Q_OBJECT public: explicit MyThread(QObject *parent = nullptr) : ...
- **start()和run()**:`start()`方法用于启动线程并执行`run()`方法中的代码。直接调用`run()`方法则不会创建新线程,而是同步执行。 - **join()**:使当前线程等待特定线程完成执行。 - **interrupt()**:中断...
5. **死亡状态**:线程完成`run()`方法或被强制停止(不推荐使用`stop()`和`destroy()`,这两个方法已过时)。 在Java中,推荐使用`interrupt()`方法来请求线程中断,然后在线程的`run()`方法中检查`isInterrupted...
`start()`方法用于启动线程,而`run()`方法包含了线程要执行的具体任务。 在给定的代码示例中,`MyThread`类通过继承`Thread`类创建了一个线程。在这个例子中,有两种方式实例化并启动`MyThread`: 1. **代码①**...
此外,需要注意的是,虽然`QThread`提供了一种方便的线程管理方式,但直接在`QThread`的`run()`函数中创建和操作GUI部件可能会导致同步问题。通常推荐将业务逻辑代码封装到独立的工作者对象(如`QObject`的子类)中...
在理解Thread类的start()和run()方法的区别时,我们需要深入探讨它们的工作原理。 首先,start()方法的主要作用是启动一个新的线程并执行该线程的run()方法。当调用start()时,Java虚拟机(JVM)会执行线程的初始化...
Java多线程编程是开发高并发应用的关键技术之一,它涉及到多个核心概念和方法。本文主要探讨了四个关键要点:Thread和Runnable的认识、Thread的start和run方法的区别、线程状态的说明以及Timer和TimerTask的使用。 ...
Java线程中的`run()`和`start()`方法是线程编程中的关键概念,它们之间有着显著的区别。首先,我们来看一下这两个方法的基本解释。 1. `start()`方法:`start()`是真正启动线程的关键,它使得线程进入就绪(可运行...