iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java多线程启动为什么调用的是start()方法而不是run() 方法
  • 838
分享到

Java多线程启动为什么调用的是start()方法而不是run() 方法

2023-06-16 12:06:37 838人浏览 泡泡鱼
摘要

这篇文章主要讲解了“Java多线程启动为什么调用的是start()方法而不是run() 方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java多线程启动为什么调用的是start()方法而

这篇文章主要讲解了“Java多线程启动为什么调用的是start()方法而不是run() 方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java多线程启动为什么调用的是start()方法而不是run() 方法”吧!

线程的状态

Java 中,定义了 6 种线程状态,在 Thread 类可以找到:

// 为了节约空间,我删除了注释 public enum State {        NEW,//初始状态        RUNNABLE,//运行状态        BLOCKED,// 阻塞状态        WaiTING,//等待状态        TIMED_WAITING,//超时等待状态        TERMINATED;//终止状态  }

这 6 种状态之间的关联,可以看下面这张图:

Java多线程启动为什么调用的是start()方法而不是run() 方法

这张图描述的还是非常详细的,结合这张图,来说说这几种状态分别代表着什么意思:

NEW 表示线程创建成功,但没有运行,在 new Thread 之后,没有 start 之前,线程都处于 NEW 状态;

RUNNABLE 表示线程正在运行中,当我们运行 strat 方法,子线程被创建成功之后,子线程的状态变成 RUNNABLE;

TERMINATED 表示线程已经运行结束,子线程运行完成、被打断、被中止,状态都会从 RUNNABLE 变成 TERMINATED;

BLOCKED 表示线程被阻塞,如果线程正好在等待获得 monitor lock ,比如在等待进入 synchronized  修饰的代码块或方法时,会从 RUNNABLE 变成 BLOCKED;

WAITING 和 TIMED_WAITING 都表示等待,现在在遇到 Object#wait、Thread#join、  LockSupport#park 这些方法时,线程就会等待另一个线程执行完特定的动作之后,才能结 束等待,只不过 TIMED_WAITING  是带有等待时间的;

优先级

优先级代表线程执行的机会的大小,优先级高的可能先执行,低的可能后执行。

在 Java 源码中,优先级从低到高分别是 1 到 10,线程默认 new 出来的优先级都是 5,源码如下:

  public final static int MIN_PRioRITY = 1;    public final static int NORM_PRIORITY = 5;     public final static int MAX_PRIORITY = 10;

线程的创建方式

我们创建多线程有两种方式,一种是继承 Thread 类,另一种是实现 Runnable 接口。两种方式的使用,如下所示:

1、继承 Thread,成为 Thread 的子类

public class MyThread extends Thread{     @Override     public void run() {         System.out.println("我是通过继承 Thread 类实现的~");     }      public static void main(String[] args) {         MyThread thread = new MyThread();         // 启动线程         thread.start();     } }

2、实现 Runnable 接口

public class MyThread1 {     public static void main(String[] args) {         Thread thread = new Thread(new Runnable() {             @Override             public void run() {                 System.out.println("我是通过 runnable 方式实现的~");             }         });         // 启动线程         thread.start();     } }

不管使用哪一种方式,启动线程都是thread.start()方法,如果你做过实验的话,你会发现  thread.run()也可以执行,为什么就一定需要调用thread.start()方法呢?

先说说结论:首先通过对象.run()方法可以执行方法,但是不是使用的多线程的方式,就是一个普通的方法,要想实现多线程的方式,一定需要通过对象.start()方法。

想要弄明白一个问题,比较好的办法就是从源码入手,我们也从这两个方法的源码开始,先来看看 start 方法的源码:

public synchronized void start() {           // 没有初始化,抛出异常     if (threadStatus != 0)         throw new IllegalThreadStateException();           group.add(this);  // 是否启动的标识符     boolean started = false;     try {      // start0() 是启动多线程的关键      // 这里会创建一个新的线程,是一个 native 方法      // 执行完成之后,新的线程已经在运行了         start0();         // 主线程执行         started = true;     } finally {         try {             if (!started) {                 group.threadStartFailed(this);             }         } catch (Throwable ignore) {                      }     } }

start 方法的源码也没几行代码,注释也比较详细,最主要的是 start0() 方法,这个后面在解释。再来看看 run() 方法的源码:

@Override    public void run() {     // 简单的运行,不会新起线程,target 是 Runnable        if (target != null) {            target.run();        }    }

run() 方法的源码就比较简单的,就是一个普通方法的调用,这也印证了我们上面的结论。

接下来我们就来说一说这个 start0() 这个方法,这个是真正实现多线程的关键,start0() 代码如下:

private native void start0();

start0 被标记成 native ,也就是本地方法,并不需要我们去实现或者了解,**为什么 start0() 会标记成 native **?

这个要从 Java 跨平台说起,看下面这张图:

Java多线程启动为什么调用的是start()方法而不是run() 方法

start() 方法调用 start0() 方法后,该线程并不一定会立马执行,只是将线程变成了可运行状态(NEW --->  RUNNABLE)。具体什么时候执行,取决于 CPU ,由 CPU 统一调度。

我们又知道 Java 是跨平台的,可以在不同系统上运行,每个系统的 CPU 调度算法不一样,所以就需要做不同的处理,这件事情就只能交给 JVM  来实现了,start0() 方法自然就表标记成了 native。

最后,总结一下,Java 中实现真正的多线程是 start 中的 start0() 方法,run() 方法只是一个普通的方法。

感谢各位的阅读,以上就是“Java多线程启动为什么调用的是start()方法而不是run() 方法”的内容了,经过本文的学习后,相信大家对Java多线程启动为什么调用的是start()方法而不是run() 方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Java多线程启动为什么调用的是start()方法而不是run() 方法

本文链接: https://www.lsjlt.com/news/283576.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java多线程启动为什么调用的是start()方法而不是run() 方法
    这篇文章主要讲解了“Java多线程启动为什么调用的是start()方法而不是run() 方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java多线程启动为什么调用的是start()方法而...
    99+
    2023-06-16
  • Java线程启动为什么要用start()而不是run()?
    目录1、直接调用线程的run()方法2、调用线程的start()方法3、总结1、直接调用线程的run()方法 public class TestStart { publi...
    99+
    2024-04-02
  • Java中为什么start方法不能重复调用而run方法可以?
    初学线程时,总是将 run 方法和 start 方法搞混,虽然二者是完全不同的两个方法,但刚开始使用时很难分清,原因就是因为初次使用时效果貌似是一样的, 如下代码所示: public...
    99+
    2024-04-02
  • golang多线程调试的方法是什么
    在 Golang 中调试多线程的方法主要有以下几种:1. 使用 GDB:GDB 是一个用于调试 C、C++、Golang 和其他编程...
    99+
    2023-10-20
    golang
  • java多线程并发调用接口的方法是什么
    在Java中,可以使用多线程并发调用接口的方法有以下几种方式:1. 实现Runnable接口:创建一个类,实现Runnable接口,...
    99+
    2023-08-14
    java
  • eclipse调试多线程的方法是什么
    在Eclipse中调试多线程的方法如下: 在Eclipse中打开要调试的Java项目。 点击菜单栏中的"Run"...
    99+
    2024-02-29
    eclipse
  • Thread.start()让线程启动的方法是什么
    这篇文章主要讲解了“Thread.start()让线程启动的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Thread.start()让线程启动的...
    99+
    2024-04-02
  • spring多线程调用接口的方法是什么
    在Spring中,可以使用多线程来调用接口的方法。有多种方法可以实现多线程调用接口的方式,以下是其中一种常见的方式:1. 使用`@A...
    99+
    2023-08-14
    spring
  • java创建多线程的方法是什么
    在Java中,有两种常见的方法来创建多线程:1. 继承Thread类:创建一个继承自Thread类的子类,重写run()方法,并在r...
    99+
    2023-08-16
    java
  • java多线程的实现方法是什么
    在Java中实现多线程有两种方法: 继承Thread类:定义一个类继承Thread类,并重写run()方法,在run()方法中编写...
    99+
    2024-03-04
    java
  • Java多线程run方法中怎么直接调用service业务类
    这篇文章主要介绍“Java多线程run方法中怎么直接调用service业务类”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java多线程run方法中怎么直接调用service业务类”文章能帮助大家解...
    99+
    2023-07-02
  • java多线程队列的使用方法是什么
    在Java中,可以使用BlockingQueue来实现多线程队列。BlockingQueue是一个线程安全的队列,它提供了put()...
    99+
    2023-10-24
    java
  • java多线程守护线程的实现方法是什么
    本篇内容介绍了“java多线程守护线程的实现方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!lass StopThread...
    99+
    2023-06-04
  • go多线程使用的方法是什么
    在Go语言中,多线程的概念被称为Goroutine。Goroutine是一种轻量级的线程,由Go语言的运行时系统管理。创建一个Gor...
    99+
    2024-03-04
    go
  • android开启线程的方法的是什么
    Android开启线程的方法有多种,以下是常用的几种方法:1. 继承Thread类:创建一个继承自Thread类的子类,重写run(...
    99+
    2023-09-14
    android
  • java多线程异步处理的方法是什么
    Java多线程异步处理的方法有几种: 使用Thread类或Runnable接口创建新的线程,然后调用start()方法启动线程,...
    99+
    2024-04-02
  • java多线程共享变量的方法是什么
    Java多线程共享变量的方法有以下几种:1. 使用共享对象:多个线程共享一个对象,并且该对象的属性被多个线程访问和修改。通过使用sy...
    99+
    2023-08-26
    java
  • java多线程删除数据的方法是什么
    Java多线程删除数据的方法有以下几种:1. 使用线程池:可以使用线程池来管理多个线程,每个线程负责删除一部分数据。线程池可以提高线...
    99+
    2023-08-18
    java
  • java多线程批量处理的方法是什么
    Java中实现多线程批量处理的方法有以下几种:1. 使用线程池:通过创建线程池来管理一组线程,可以提交多个任务给线程池,线程池会自动...
    99+
    2023-08-18
    java
  • java多线程并行处理的方法是什么
    Java中实现多线程并行处理的方法有以下几种:1. 继承Thread类:创建一个继承自Thread类的子类,重写run()方法,在r...
    99+
    2023-09-21
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作