Thread类中start方法和run方法的源码简单解读,联系和区别

我们可以打开idea,按住ctrl将光标移至所查方法上,单击右键,即可查看这两个方法的源码:

1. start方法源码

我们从上至下分析一下:

这个threadStatus是一个int型的变量来表示线程是否开始,0为没有开始,非0为开始,因此当threadStatus不为0时,会抛出非法开始线程的异常.

group对象是用来记录已经开始的线程组的对象.设置started用来表示当前线程还没有开始,正准备要开始,因此初始化为false.

接下来,源码中使用了try-finally语句,在finally语句中又嵌套了try-catch语句.

第一个try中的语句十分关键:

其中调用了一个native方法(表示这个方法通过C++代码实现,JVM已经帮我们封装好了,我们无法查看其中具体的实现,直接调用即可)-->start0.

这个start0方法的描述中写道:如果这个线程使用一个被分离的Runnable对象,这个对象的run()方法就被调用了,否则这个方法直接返回.

接着,如果调用了对象的run方法,将started设置为true,进入finally语句;否则直接抛出一个Throwable对象;finally语句中通过判断started的值,如果started为false,将这个没有正常开启的线程加入group,catch Throwable对象,接下来的处理我们不过多介绍,着重分析成功开启线程的情况.

2. run方法源码

run这个方法看上去十分简单,上面有一个@Override注解,说明我们在创建线程应该要对这个方法进行重写,我们之前创建线程时也确实是这么做的.

在这个run方法中,判断了target对象是不是空,如果不是空的话,调用target对象的run方法.那么这个target对象是什么呢?通过作为隐式参数传递,实现了run方法,可以推断出它肯定是一个Thread类中定义的Runnable对象.我们如法炮制,ctrl右键单击点过去,揭开target的神秘面纱:

事实如我们所料,target这个对象表示哪个对象将被调用run方法.那么在new一个Thread对象时,如果我们什么都不传入,target引用的值默认为null,那么Thread类肯定有一个传入target对象的构造方法.

这里的确存在一个传入target的构造方法.这里面的init方法是用来初始化线程的一些基本属性,这里不做过多介绍.

3. 两个方法的联系和区别

3.1 是否需要重写

对于start方法,直接调用即可;而run方法需要被重写,才能被有意义地调用.

3.2 功能不同

start方法做的事比较多:线程的开启,以及开启成功或失败后的收尾操作;而run方法只注重于这个线程需要进行什么样的操作.

3.3 包含关系

start方法中会调用start0,start0方法中调用了Runnable对象的run方法;因此实际上是start方法在正常开启线程的过程中会调用run方法.

3.4 输出不同

start方法正常情况不会输出任何东西,根据源码我们发现即使是抛出了一个throwable对象,也并不会进行任何的打印操作.但是当线程已经开启时,调用start方法会抛出异常.

run方法则是可以进行输出.如果我们不重写run方法,也不会得到任何的输出.但是,如果我们在target对象传入时重写了run方法,在其中写了打印操作,就可以得到输出.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/774039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

可怜的百度人

可怜的百度股民 注意,这里说的是持有百度股票的股民,不是百度,百度没啥好可怜的。 前天(3月25日)中午,财联社爆料百度和 Apple 达成合作,百度将为苹果今年发布的 iPhone16、Mac 系统和 iOS18 提…

气体放电的基本物理过程

本篇为本科课程《高电压工程基础》的笔记。 和固体液体介质相比,气体绝缘有不老化的有点,而且击穿后具有完全的绝缘自恢复特性,是绝缘部分的重点。 带电质点的产生与消失 中性气体不到点,但是由于宇宙射线和地壳中的放射性物质…

如何做好位移计保养和维修工作

当涉及到保养和维修位移计时,我们需要考虑一系列的因素,包括正确的使用方法、定期的保养程序以及必要的维修步骤。位移计是一种用于测量物体相对位置变化的仪器,因此其准确性和可靠性对于许多工程和科学应用至关重要。以下是一些关于如何保养…

【前端面试3+1】01闭包、跨域、路由模式

一、对闭包的理解 定义: 闭包是指在一个函数内部定义的函数,并且该内部函数可以访问外部函数的变量。闭包使得函数内部的变量在函数执行完后仍然可以被访问和操作。 特点: 闭包可以访问外部函数的变量,即使外部函数已经执行完毕。…

2023最新版Android studio安装入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

目录 JDK安装与配置 一、下载JDK 二、JDK安装 三、JDK的环境配置 四、JDK的配置验证 Android studio安装 Android studio连接手机真机调试(以华为鸿蒙为例) 一、新建一个android项目 二、进入项目面板 三、配置Android Studio 四、安装手机驱…

抽象类和接口(1)(抽象类部分)

抽象类概念 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 此外还有抽象方法这个概念 …

拿到今日现货白银价格 如何开始分析?

很多投资者看到近期现货白银的强劲涨势,并且开户入场。但入场之后,他们发现对如何找到机会还不甚了解。比方说我们拿到今日现货白银价格要如何开始分析呢,很多新入场的投资者根本没有头绪,下面我们就来讨论一下相关的方法。 我们可…

Java入门之数据类型

一、数据类型 基本数据类型 (1)如果要定义“long类型的变量要在数值后面加一个L作为后缀” (2)如果要定义float类型的变量的时候数据值也要加一个作为后缀 小结: 练习 内容: 姓名:巴巴托斯 &…

【比特币】比特币的奥秘、禁令的深层逻辑与风云变幻

导语: 比特币(Bitcoin),这个充满神秘色彩的数字货币,自诞生以来便成为各界瞩目的焦点。它背后所蕴含的Mining机制、禁令背后的深层逻辑以及市场的风云变幻,都让人欲罢不能。今天,我们将深入挖掘比特币的每一个角落&…

docker将本地镜像pull到阿里云和registry

目录 一、上次到阿里云服务器 1、制作一个带有vim功能的Ubuntu镜像 2、在阿里云上面创建镜像仓库 3、从阿里云仓库中上传和拉取镜像 二、上传镜像到本地私有库registry 1、下载镜像docker registry 2、运行私有库registry,相当于本地有个私有docker hub。 3…

Rust使用feature特性和条件编译,以及常用feature使用说明

Cargo Feature 是非常强大的机制,可以为大家提供条件编译和可选依赖的高级特性,可以为你省下不少的代码量来判断操作系统和条件编译等功能。rust官方条件编译文档:Conditional compilation - The Rust Reference features特性 Featuure 可以…

零基础学习挖掘PHP网站漏洞

教程介绍 本套课程,分为三个阶段:第一阶段:基础篇 学习PHP开发的基础知识,对PHP常见的漏洞进行分析,第二阶段:进阶篇 实战PHP漏洞靶场,了解市面上的PHP主流网站开发技术,并对市面上…

RocketMQ 流数据库解析:如何实现一体化流处理?

作者:林清山(隆基) 前言: 从初代开源消息队列崛起,到 PC 互联网、移动互联网爆发式发展,再到如今 IoT、云计算、云原生引领了新的技术趋势,消息中间件的发展已经走过了 30 多个年头。 目前&a…

AI+云平台|全闪云底座迎战

AI融万物之势席卷而来 人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 行业特点 AI场景中80%以上是小文件,以非结构化数据为…

vue 隐藏导航栏和菜单栏,已解决

初始效果: 效果: 出现问题: 解决方法:

使用docker-compose搭建wordpress博客

1、从远程仓库拉取worldpress镜像到本地 2、新建一个项目,然后在新建的项目目录里面新建一个docker-compose.yml模版文件。 3、编写docker-compose.yml文件 4、docker-compose up 运行项目。 5、在浏览器测试 使用docker-compose搭建wordpress博客实验成功。

配置wss和隐藏端口号(WebSocket通信)

修改宝塔面板配置文件: 添加这几行代码: location /wss{proxy_pass http://127.0.0.1:23481; # 根据自己的socket端口号修改proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";proxy_s…

全网最详细的 Ubuntu 18.04 安装Livox mid-360驱动,测试 fast_lio2

目录 一、前言 二、依赖的环境 三、 安装Livox-SDK2,fast_lio2 和 livox_ros_driver2 (1) 安装Livox-SDK2 (2) 安装 fast_lio2 和 livox_ros_driver2 四、mid-360 设备硬件设置 五、运行设备 六、topic信息查看 一、前言 Livox mid-360需要使用Livox-SDK2…

【OceanBase OBCP题目解析17】关于OceanBase事务引擎一致性特点,描述正确的是

本文为云贝教育郭一军(微信:guoyJoe)原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。 关于OceanBase事务引擎一致性特点,描述正确的是 ? A. 保证…

海外媒体宣发:企业出海最有“范儿”的几大媒体

1. 雅虎财经(Yahoo Finance) 雅虎(英文名称:Yahoo,NASDAQ:YHOO)是美国著名的互联网门户网站,也是20世纪末互联网奇迹的创造者之一。其服务包括搜索引擎、电邮、新闻等,业…