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

16 篇文章 0 订阅
订阅专栏
本文详细解析了Java中Thread类的start和run方法,包括它们的源码实现、重写需求、功能区别、包含关系以及输出行为,帮助理解线程启动流程和编程实践。
摘要由CSDN通过智能技术生成

我们可以打开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方法,在其中写了打印操作,就可以得到输出.

Thread使用start和run方法区别
weixin_39454351的博客
04-02 371
相信Thread对我们来说并不陌生,学java的时候都是入门的东西,我们一般使用thread都是new一个线程,然后调用start方法启动,使用start方法才真正实现了多线程运行,因为这个时候不用等待我们的run方法执行完成就可以继续执行下面的代码,这才叫多线程嘛!因为thread线程有5种状态,创建-就绪-运行-阻塞-死亡这五种,那么我们的start方法呢就是就绪这一步,因为这个时候我们的线程...
深入线程Thread类的start()方法run()方法
s11show_163的博客
01-30 758
摘自:https://cloud.tencent.com/developer/article/1136459 一、初识 java的线程是通过java.lang.Thread类来实现的。VM启动时会有一个由主方法所定义的线程。可以通过创建Thread的实例来创建新的线程。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。 在Java当中,线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。 .
Thread 类中的start() 和 run() 方法有什么区别
qq_33240556的博客
12-29 520
方法则定义了新线程要执行的任务。在某些情况下,你可能需要同时使用这两个方法,例如,你可能需要在主线程中调用新线程的。不过需要注意的是,如果你没有正确地实现这两个方法,可能会导致一些并发问题。方法等待线程结束),那么可能会导致主线程无法正常结束。因此,正确地使用这两个方法是非常重要的。方法都是用于启动新线程的方法,但它们在功能和用途上有一些关键的区别方法并指定一些初始状态参数,然后再在子线程中调用自己的。方法中的代码没有正确地结束线程(例如,没有使用。方法用于启动新线程并调用其。
Thread类中run方法和start方法区别
最新发布
2301_79075954的博客
07-27 241
2.start调用方法后, start方法内部会调用Java 本地方法(封装了对系统底层的调用)真正的启动线程,并执行run方法中的代码,run 方法执行完成后线程进入销毁阶段。1. run方法是一个类中的普通方法,主动调用和调用普通方法一样,会顺序执行一次;1.run方法的作用是描述线程具体要执行的任务。2.start方法的作用是真正的去申请系统线程。方法有着重要的区别
Thread类中的start()方法run()方法
m0_60742341的博客
10-13 1421
Thread类中的start()方法run()方法
Java基础加强之并发(三)Thread中start()和run()的区别
weixin_33950035的博客
03-02 122
Thread中start()和run()的区别 start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。start()不能被重复调用。run()   : run()就和普通的成员方法一样,可以被重复调用。单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程! MyThreadTest.java代码 class MyThread extends ...
线程Thread类的start()方法run()方法
别抢我蓝buff
02-24 5040
一、初识 java的线程是通过java.lang.Thread类来实现的。VM启动时会有一个由主方法所定义的线程。可以通过创建Thread的实例来创建新的线程。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。 在Java当中,线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。   ...
Java多线程中run和start的区别
weixin_33758863的博客
11-24 169
Thread的start和run 1) start: 用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到spu时间片,就开始执行run()方法,这里方法run()称为线程体,它包含了要执行的这个线程...
java thread start()和run()方法简析
09-05
本文将深入探讨`start()` 和 `run()` 方法区别及其在多线程环境中的作用。 1. **start() 方法** `start()` 方法是启动线程的关键。当你调用 `Thread` 对象的 `start()` 方法时,Java虚拟机(JVM)会执行以下几...
Java Thread中start()和run()的区别_动力节点Java学院整理
08-30
在Java多线程编程中,理解`Thread`类的`start()`和`run()`方法区别至关重要。这两个方法在实现线程并发执行时起到不同的作用。 首先,`start()`方法是用于启动一个新的线程。当你调用`start()`方法时,Java虚拟机...
Java--深入JDK和hotspot底层源码剖析Threadrun()、start()方法执行过程
JustinQin
09-26 2302
【学习背景】 今天主要是来了解Java线程Thread中的run()、start()两个方法的执行有哪些区别,会给出一个简单的测试代码样例,快速理解两者的区别,再从源码层面去追溯start()底层是如何最终调用Thread#run()方法的,个人觉得这样的学习不论对面试,还是实际编程来说都是比较有帮助的。 进入正文~ 学习目录一、代码测试二、源码分析2.1 run()方法2.2 start()方法三、使用总结 一、代码测试 执行Threadrun()、start()方法的测试代码如下: public
Java中启动线程start和run的两种方法
08-28
Java中启动线程start和run的两种方法 Java 中启动线程有两种方法,即继承 Thread 类和实现 Runnable 接口。由于 Java 无法实现多重继承,所以一般通过实现 Runnable 接口来创建线程。但是,无论哪种方法都可以通过 ...
java基本教程之Thread中start()和run()的区别 java多线程教程
09-04
在理解Thread类的start()和run()方法区别时,我们需要深入探讨它们的工作原理。 首先,start()方法的主要作用是启动一个新的线程并执行该线程的run()方法。当调用start()时,Java虚拟机(JVM)会执行线程的初始化...
Thread的start()和run()
喜欢讨论、分享
06-27 781
认识Thread的start和run  1) start:      用 start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的
java线程系列一:Thread类中的start()方法run方法
bitcarmanlee的博客
04-08 3847
1.java中的线程状态 在java中,线程通常有五种状态:创建,就绪,运行,阻塞与死亡。 1:创建(NEW) 在生成线程对象的时候,并没有调用start方法,这是线程的创建状态。 2:就绪(RUNABLE) 当调用线程对象的start方法以后,线程就进入了就绪状态。但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。 3...
说明Thread类中run和start的区别
qq_66767167的博客
10-09 228
run方法的作用是描述线程要执行的任务/创建的对象,但线程描述出来并不意味着线程就开始运行;start的作用是真正在操作系统的底层申请系统线程,新线程才会执行run方法
Thread类的start()方法run()方法区别
2302_79968236的博客
07-10 1075
目的不同start()方法用于启动线程,而run()方法定义了线程执行的任务。执行方式不同:start()方法导致run()方法在新线程中异步执行(下面有解释),而直接调用run()方法则是在当前线程中同步执行。线程状态影响:调用start()方法会改变线程的状态,并启动线程的执行流程;而调用run()方法则不会。使用限制:start()方法在一个线程的生命周期中只能被调用一次;而run()方法则可以被任意次调用(尽管直接调用通常不符合多线程编程的初衷)异步执行。
Thread的Start和Run方法区别详解
thaddeuslu的博客
09-26 1210
Thread的Start和Run方法区别功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 创建线程的两种方式,继承Thr...
Thread类中run和start
weixin_73775528的博客
03-31 418
2.start调用方法后, start方法内部会调用Java 本地方法(封装了对系统底层的调用)真正的启动线程,并执行run方法中的代码,run 方法执行完成后线程进入销毁阶段。原文链接:https://blog.csdn.net/tl2267190799/article/details/129391509。1.run方法是一个类中的普通方法,主动调用和调用普通方法一样,会顺序执行一次;1.run方法的作用是描述线程具体要执行的任务;2.start方法的作用是真正的去申请系统线程。
eclipse的Job类schedule方法会调用run方法吗?源码分析
06-06
是的,Job类的schedule方法会调用run方法。我们可以从Eclipse源代码中找到相关的实现。 在`org.eclipse.core.internal.jobs.JobManager`类中的`doSchedule(Job, long)`方法中,会创建一个`JobThread`对象,并将其加入到`JobManager`的线程池中: ``` JobThread thread = new JobThread(job); thread.setSystem(job.isSystem()); thread.setPriority(job.getPriority()); thread.setDaemon(true); thread.start(); ``` `JobThread`是`Thread`的子类,其实现了`Runnable`接口。在`JobThread`类中,会调用`Job`对象的`run()`方法: ``` try { if (!monitor.isCanceled()) job.run(monitor); } catch (Throwable e) { // handle the case where the job throws an exception } finally { job.done(monitor); if (monitor != null) monitor.done(); } ``` 因此,可以看出,当我们调用Job类的schedule方法时,它会在后台创建一个线程,并在指定的延迟时间后启动该线程,并调用run方法。在run方法中,我们可以编写我们需要执行的任务。
写文章

热门文章

  • 二叉树的基础概念及遍历 1966
  • 常见的锁策略,synchronized优化过程和cas过程 1900
  • mysql事务详解 1554
  • 单例模式基本介绍及两种实现方式详解 1297
  • 二叉树基础oj题目 1068

分类专栏

  • JavaEE进阶 3篇
  • JavaEE初阶 16篇
  • JavaSE 12篇
  • mysql 2篇

最新评论

  • MyBatis的XML实现方法

    Kwan的解忧杂货铺@新空间代码工作室: 每一次阅读都是一次知识的盛宴🔥🔥🔥,让我增长了不少见识,博主的博客是我的学习良师,每篇文章都充满了启发🎉 🎉 🎉,让我得到了更多的智慧,你的文章总是充满了深度和洞见,让我对这个领域有更深刻的理解。期待更多精彩内容。

  • Spring中存储Bean的相关注解及用法

    CSDN-Ada助手: 不知道 Java 技能树是否可以帮到你:https://edu.csdn.net/skill/java?utm_source=AI_act_java

  • 优先级队列(堆)详解

    CSDN-Ada助手: 推荐 算法 技能树:https://edu.csdn.net/skill/algorithm?utm_source=AI_act_algorithm

  • 类和对象(下)

    小江同学~12345: 博主分析的很到位,讲解的也很清晰,很容易就能看懂并且跟上思路,超级厉害!!!

  • 数据类型与变量

    小江同学~12345: 我佬超赞表情包

大家在看

  • 中英双语酒店管理系统——pms系统,海外版
  • 论文 Python 实现WOA-CNN-BiGRU-Attention数据分类预测 64
  • 手环押金原路退回系统——足浴店——东方仙盟

最新文章

  • MyBatis的XML实现方法
  • Spring中存储Bean的相关注解及用法
  • SpringBoot中常用的注解及其用法
2024年32篇
2023年29篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家商场玻璃钢花盆采购天心玻璃钢造型雕塑做玻璃钢雕塑平台联系方式东方主题玻璃钢人物雕塑批发商场美陈快闪景观玻璃钢雕塑哪家靠谱滁州欧式玻璃钢雕塑玻璃钢雕塑快递是怎么算运费商场彩灯美陈宁波玻璃钢雕塑报价北京石雕雕塑玻璃钢玻璃钢景观雕塑订购广东水果玻璃钢雕塑定制徐州玻璃钢雕塑厂品牌企业长沙玻璃钢树脂雕塑多少钱玻璃钢花盆会碎吗湖北公园玻璃钢雕塑联系方式昆明玻璃钢雕塑生产厂家园林景观玻璃钢雕塑设计厂家来宾玻璃钢人物雕塑东莞玻璃钢奶牛雕塑商场增加美陈的申请楚雄玻璃钢圆门头雕塑邵阳市玻璃钢雕塑江汉玻璃钢雕塑厂家宁夏猪猪侠玻璃钢雕塑报价上海主题商场美陈怎么样上海开业商场美陈供货商鹤壁玻璃钢仿铜雕塑定做厂家遂宁玻璃钢卡通雕塑效果图香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化