线程start() 和 run()的区别

35 篇文章 4 订阅
订阅专栏

start() 和 run()的区别:

首先需要知道线程的几个状态以及多线程工作方式。

  • new 一个Thread,线程进入了新建状态,调用start() 方法,会启动一个线程并使线程进入了就绪状态,当分配到 时间片 后就可以开始运行了。start() 会执行线程的相应准备工作,然后自动执行run() 方法的内容,这是真正的多线程工作。
  • 而直接执行run() 方法,会把run 方法当成一个main 线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。

总的来说:调用start 方法方可启动线程并使线程进入就绪状态,而run 方法只是thread 的一个普通方法调用,还是在主线程里执行。

线程生命周期(状态):

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
Java中线程状态6种:
NEW:新建
RUNNABLE:可运行/就绪
BLOCKED :阻塞
WAITING :等待/不见不散
TIMED_WAITING :超时等待/过时不候
TERMINATED:终止

注意
BLOCKED/WAITING/TIMED_WAITING 这三种状态都不会获得CPU使用权

  1. 新建(new):新创建了一个线程对象。

  2. 可运行(runnable):线程对象创建后,当调用线程对象的 start()方法,该线程处于就绪状态,等待被线程调度选中,获取cpu的使用权。

  3. 运行(running):可运行状态(runnable)的线程获得了cpu时间片(timeslice),执行程序代码。注:就绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;

  4. 阻塞(block):处于运行状态中的线程由于某种原因,暂时放弃对 CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被 CPU 调用以进入到运行状态。

阻塞的情况分三种:

阻塞状态(BLOCKED)
阻塞状态是指线程因为某种原因释放 cpu 使用权,也即让出了 cpu timeslice时间片,暂时停止运行。 直到线程进入可运行(runnable)状态,才有机会再次获得 cpu timeslice 转到运行(running)状 态。阻塞的情况分三种:

  • 等待阻塞(o.wait->等待队列)
    运行(running)的线程执行 o.wait()方法,JVM 会把该线程放入等待队列(waitting queue) 中。

  • 同步阻塞(lock->锁池)
    运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则 JVM 会把该线 程放入锁池(lock pool)中。

  • 其他阻塞(sleep/join)
    运行(running)的线程执行 Thread.sleep(long ms)或 t.join()方法,或者发出了 I/O 请求时, JVM 会把该线程置为阻塞状态。当 sleep()状态超时、join()等待线程终止或者超时、或者 I/O 处理完毕时,线程重新转入可运行(runnable)状态。

  1. 死亡(dead):线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。

深入理解start方法:

start方法源码:

public synchronized void start() {
        /**
         * This method is not invoked for the main method thread or "system"
         * group threads created/set up by the VM. Any new functionality added
         * to this method in the future may have to also be added to the VM.
         *
         * A zero status value corresponds to state "NEW".
         */
        if (threadStatus != 0)
            throw new IllegalThreadStateException();

        /* Notify the group that this thread is about to be started
         * so that it can be added to the group's list of threads
         * and the group's unstarted count can be decremented. */
        group.add(this);

        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
                /* do nothing. If start0 threw a Throwable then
                  it will be passed up the call stack */
            }
        }
    }
 //=============start0方法,是一个本地方法,底层是c实现的===============
 private native void start0();

从整个方法上的注释看,start()使得该线程开始执行,Java虚拟机调用这个线程的run()方法,结果是两个线程会并发的运行:当前线程(调用start()方法的"主线程")与另一个线程(执行其run方法)

start()之后的代码的核心就是其中调用的start0()方法,下面看看start0()的定义:
private native void start0();
很明显这是一个只声明而未实现的方法,native表示调用本机的原⽣系统函数,native 方法往往意味着这个方法无法使用平台无关的手段来实现。所以,还是那句话,实际上线程的实现与 Java 无关,由平台所决定.

总结:

1、start()方法的具体流程:start方法(判断当前线程是不是首次创建,Java方法)->调用start0()方法(JVM)->通过JVM进行资源调度,系统分配->回调run()方法(Java方法)执行线程的具体操作任务
2、由于start()方法调用了JVM进行系统调度、系统分配等一系列操作,因此创建一个线程只能由start()来完成,而若直接调用run()方法,相当于是在调用一个普通方法

java线程中start和run区别详解
08-25
主要介绍了java线程中start和run区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java中启动线程start和run的两种方法
08-28
Java中启动线程start和run的两种方法 Java 中启动线程有两种方法,即继承 Thread 类和实现 Runnable 接口。由于 Java 无法实现多重继承,所以一般通过实现 Runnable 接口来创建线程。但是,无论哪种方法都可以通过 ...
javarun方法_Java线程run()方法和start()方法有什么区别
weixin_32049849的博客
02-12 673
欢迎大家关注我的公众号,有问题可以及时和我交流。由于Java是支持单继承的(接口除外),所以我们普遍启动线程的方式都是实现Runnable接口并重写run()方法。先来看下面一个简单的实例:public class MyRunnable implements Runnable {@Overridepublic void run() {try {// 睡眠3秒TimeUnit.SECONDS.sle...
run()和start()的区别
最新发布
m0_64421869的博客
07-27 653
通过两个例子我们可以知道调用start方法可启动线程,可以并发,而run方法只是thread的一个普通方法调用,还是在主线程里执行。这里的意思就是说,star()方法可以异步地调用run()方法,是异步执行,直接调用run()方法是同步执行,因此也就不能达到多线程的目的。这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void。
线程run() 和 start() 有什么区别
m0_68464502的博客
06-05 4070
而当我们直接调用run()方法时,则会在当前线程中执行,不会产生新的线程run()方法是Thread类中的一个普通方法,它是线程中实际运行的代码,线程的代码逻辑主要就是在run()方法中实现的。start()方法是Thread类中的一个启动方法,它会启动一个新的线程,并在新的线程中调用run()方法。直接调用run()方法,会像普通方法一样在当前线程中顺序执行run()方法的内容,这并不会启动一个新的线程。调用start()方法会创建一个新的线程,并在新的线程中并行执行run()方法的内容。
线程run()和 start()有什么区别
大连赵哥的博客
02-19 969
线程run()和 start()有什么区别
线程中的start()方法和run()的区别
superman__007的博客
09-14 7093
一、区别 1、线程中的start()方法和run()方法的主要区别在于,当程序调用start()方法,将会创建一个新线程去执行run()方法中的代码。但是如果直接调用run()方法的话,会直接在当前线程中执行run()中的代码,注意,这里不会创建新线程。这样run()就像一个普通方法一样。 2、另外当一个线程启动之后,不能重复调用start(),否则会报IllegalStateException异常。但是可以重复调用run()方法。 总结起来就是run()就是一个普通的方法,而start()会创建一个
java中thread线程start和run区别
09-04
`Thread`类是Java中用于创建和管理线程的核心类,而`start()`和`run()`方法是与线程执行密切相关的方法,它们之间存在显著的区别。 首先,`run()`方法是`Runnable`接口或`Thread`类中的一个成员方法。当你需要创建...
线程start和run区别
07-28
Java中的线程有两种启动方式:start()方法和run()方法。 - start()方法:启动一个新线程,并调用线程run()方法。使用start()方法启动线程,系统会为新线程创建一个新的栈,并在新栈中执行run()方法。 - run()方法...
Java线程中start和run方法全面解析
09-01
接下来,我们来看`start`和`run`方法的区别。`start`方法是用于启动线程的关键,它是一个同步方法,确保线程不会在未准备好时启动。在`start`方法内部,它首先检查线程的状态,如果线程已经启动或已经终止,就会抛出...
线程start和run方法的区别
08-27 355
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11421515.html start 用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执...
线程
y368769的博客
10-10 285
概述: 多线程是可以同时执行多个任务的过程,是一个轻量级的子进程 进程和线程区别: 进程是资源分配最小的单元,线程是 程序执行的最小单位 进程在执行过程中有独立的内存空间,而多线程是共享内存 线程在执行过程中会有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立运行必须依赖于应用程序,由应用程序提供多个线程执行控制 创建一个线程比进程的开销小,占用的资源少 一个线程只能属于一个进...
线程中start方法和run方法的区别
热门推荐
qq_40649503的博客
05-03 1万+
线程中start方法和run方法的区别
线程中start和run区别
paul342的专栏
08-06 1119
之所以出现线程,就是为了更好的利用CPU,让她更加“精明”的干活。 通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体, 它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止, 而CPU再运行其它线程, 而如果直接用Run方法, 这只是调
Java Thread中 run方法和start方法的区别
高智商坏蛋的博客
06-14 397
java Thread中,run方法和start方法的区别 1.start方法 用 start方法来启动线程,是真正实现了多线程, 通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法。但要注意的是,此时无需等待run()方法执行完毕,即可继续执行下面的代码。所以run()方法并没有实现多线程。 2.run方法 run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程
线程 start 和 run 方法到底有什么区别
Java技术栈,分享最主流的Java技术
11-13 1553
昨天栈长介绍了《Java线程可以分组,还能这样玩!》线程分组的妙用。今天,栈长会详细介绍 Java 中的多线程 start() 和 run() 两个方法,Java 老司机请跳过,新手或者对这两个不是很理解的可以继续往下看。 首先要知道实现多线程最基本的两种方式: 1、继承 java.lang.Thread 类; 2、实现 java.lang.Runnable接口; 其中 Thread 类也是实现...
线程中start()和run()的区别
YILONGC的博客
07-19 430
1、run()相当线程的任务处理逻辑的入口方法,由Java虚拟机在运行相应线程时直接调用,而不是由代码进行调用。 2、start()的作用是于启动相应的线程,实际是请求Java虚拟机运行相应的线程,而这个线程何时能运行是由线程调度器决定的。start()调用结束并不表示线程已经开始运行,这个线程可能稍后运行,也可能永远不会运行。 3、直接调用run(),只是调用了一个实例的方法,并未启动线程,...
写文章

热门文章

  • idea使用教程 63730
  • Linux安装MongoDB(简单详细) 25576
  • Redis哨兵模式(一主二从三哨兵) 22052
  • 生产者消费者模式三种实现方式 19086
  • SOP(标准作业程序)和WI(操作指导书)的联系和区别 16099

分类专栏

  • 机械 54篇
  • 电工 3篇
  • 数据结构和算法 24篇
  • MongoDB 6篇
  • Redis 16篇
  • 面试 56篇
  • MQ 10篇
  • postman/swagger 4篇
  • maven 5篇
  • spring 21篇
  • Dubbo 1篇
  • Nginx 1篇
  • linux 18篇
  • javaweb 9篇
  • springboot 37篇
  • springcloud 33篇
  • mybatis-plus 4篇
  • mybatis 14篇
  • 错误总结 2篇
  • springmvc 10篇
  • spring注解开发和纯注解开发
  • 设计模式 3篇
  • Docker 2篇
  • javase 82篇
  • 多线程 35篇
  • spring-test 1篇
  • Idea 1篇
  • Git/Github 2篇
  • ajax 2篇

最新评论

  • SOP(标准作业程序)和WI(操作指导书)的联系和区别

    这个名字先用着: 说的很好。学到了

  • 一文深入了解Cmk

    qq_40613940: 不太清晰

  • SOP(标准作业程序)和WI(操作指导书)的联系和区别

    chazcn: 博主说得很详细了,谨补充一点拙见。 我曾经在大厂做生产管理,多次参与 WI 和 SOP 的编写。作为产线标准文档,WI 和 SOP 的主要区别在于: WI(作业指导)非常简洁,只写明简明操作流程,通常只有 1-2 页,在工位上封装悬挂,保证一个新上岗的员工能够看懂,在老员工的指导下,可以依照 WI 快速上手。 SOP(标准作业流程)的内容则需要相当详尽。 在操作指导部分,不仅要给出正常操作流程,还要对每个操作步骤进行详细说明,并注明其标准工时。 另外,就像博主整理的一样,SOP 需要涵盖物料说明、工具说明、设备基本操作说明、人员配置说明、安全作业规范等内容。 除此之外,SOP 还包含各种故障和其它突发状况的紧急处理方式,这也是 SOP 修订更新频率最高的部分。 总的来说,WI 是简明操作指导,可以帮助工人尽快上手;而 SOP 更像是速查手册,尽量包含该工序可能需要的所有信息。SOP 不需要工人逐字阅读,但生产中遇到问题时,工人及管理、技术人员都可以随时查阅。

  • 基恩士PLC-KV5500基础入门

    2401_87361500: 您好,我能问一下R6那个是低电平输入还是高点平输入

  • redis分布式锁

    Yigezxy: 强,放置个uuid

最新文章

  • 滚花螺纹的工艺
  • creo曲面建模1
  • 几何公差的设计和选用
2024年30篇
2023年29篇
2022年118篇
2021年147篇
2020年45篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为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 网站制作 网站优化