start() 和 run() 方法启动线程的区别 ?

线程中断interrupt导致sleep产生的InterruptedException异常 线程中断引发的中断异常 阅读详情

结论:

  • start() 方法会启动一个新的线程,以及线程的一些准备工作(状态检查,加入通知线程组),然后 Java 虚拟机调用此线程的 run() 方法;
  • run() 方法是直接执行 Runnable 对象的 run() 方法,是 main 线程下的一个普通线程,并不是多线程执行;

源码分析(Java8):

/**
* 使该线程开始执行;Java 虚拟机将调用此线程的 <code>run</code> 方法。
* 结果是两个线程同时运行:当前线程(从调用返回到<code>start</code>方法)和另一个线程(执行其<code>run</code>方法)。
* 多次启动一个线程永远是不合法的。特别是,线程一旦完成执行就可能不会被重新启动。
* @exception  IllegalThreadStateException 如果线程已经启动,会抛出 java.lang.IllegalThreadStateException
* @see        #run()
* @see        #stop()
*/
public synchronized void start() {
    /**
        * VM 不会为 main() 方法线程或系统线程组 created/set 调用此方法。
        * 将来添加到此方法的任何新功能可能也必须添加到 VM。
        * "0" 状态值对应的线程状态为 "NEW"。
        */
    if (threadStatus != 0)
        throw new IllegalThreadStateException();

    /**
    * 通知组该线程将要启动,以便可以将其添加到组的线程列表中,并且可以减少改组的未启动计数。
    */
    group.add(this);

    boolean started = false;
    try {
        start0();
        started = true;
    } finally {
        try {
            if (!started) {
                group.threadStartFailed(this);
            }
        } catch (Throwable ignore) {
            /**
                * 什么也不做,如果 start0() 方法抛出 Throwable,则它将被向上传递到调用调用堆栈。
                */
        }
    }
}

private native void start0();


/**
* 如果此线程是使用单独的<code>Runnable</code>运行对象构造的,
* 则将调用该<code>Runnable</code>对象的<code>run</code>方法;否则,此方法不执行任何操作返回。
* <code>Thread</code>的子类应重写此方法。
*/
@Override
public void run() {
    if (target != null) {
        target.run();
    }
}

start() 方法分析:

  1. 首先检查线程状态 threadStatus 是否为 0,0 状态代表线程的 “NEW” 状态,不为 0 会抛出 IllegalThreadStateException 异常;
  2. 将线程加入通知组;
  3. 然后调用一个 native 类型的 start0() 方法,此方法会在 VM 中调用此线程的 run() 方法,使线程进入 READY 状态;

run()方法分析:

  1. 检查 target(Runnable 对象)是否为空,不为空时直接调用 Runnable 的 run() 方法,只是main线程下一个普通线程,并不是多线程。
java中使用interrupt通知线程停止 这里的 if (Thread.currentThread().isInterrupted()) 判断,就是要你的代码有响应中断的能力。但是由于 sleep 设计理念,导致 Thread.currentThread().isInterrupted() 标记位会被清除,也就是说,虽然线程在 sleep 过程中收到了 interrupt 中断通知,并且也捕获到了异常、打印了异常信息,所以说,不要以为调用了 interrupt() 方法,线程就一定会停止。通知线程停止,线程不会立即停止,而是会在合适的时候停止。 阅读详情

相关推荐

【Java多线程】慎用这种方式模拟并发请求,我差点把服务弄蹦了~

java中模拟并发请求,自然是很方便的,只要多开几个线程,发起请求就好了。但是,这种请求,一般会`存在启动的先后顺序了`,算不得真正的同时并发!怎么样才能做到真正的同时并发呢?java中提供了`闭锁 CountDownLatch、信号量Semaphore`、`同步屏障CyclicBarrier,` 刚好就用来做这种事就最合适了。

墩墩分墩 1656

sleep、interrupt等线程相关方法介绍

另外,打断处于执行在sleep,wait,join等方法的线程会将改线程的打断状态标记为false,表示没有被打断。如果打断的是正常执行的线程,则会将打断状态改成true,但是实际上只是修改了这个标记,并没有真的打断线程的执行,如果我们想让这个打断生效需要自己编写业务逻辑的代码让我们的线程终止。用interrupt方法打断处于park的线程,会将这个线程的打断状态置为true,并且如果再次执行park方法并不能暂停线程的执行,这也是park方法的特点,只能打断打断标志是false的线程。

怕什么真理无穷,进一寸有一寸的欢喜。即使开了一辆老掉牙的破车,只要在前行就好,偶尔吹点小风,这就是幸 1737

启动线程方法 start ()和 run ()有什么区别

方法只是在当前线程中普通地调用方法,没有实现多线程的效果。通常情况下,我们应该使用。方法会创建一个新的线程并使其并发执行,而使用。方法来启动线程,以实现真正的并发执行。在Java中,线程可以通过调用。

学无止境 691

线程sleep方法和InterruptedException异常

知道为啥每次调用Thread.sleep(...)方法时,都要求你捕获InterruptedException异常吗?sleep方法和 interrupt方法的关系又是什么呢?

weixin_67049753的博客 4069

大众点评爬虫实战:如何用Python绕过反爬机制获取评论数据(附完整代码)

本文深入探讨了2024年使用Python进行大众点评数据采集的实战策略。文章详细解析了现代反爬机制的核心逻辑,并提供了从构建拟人化请求会话、应对动态内容与接口加密,到工程化实践(代理调度、状态持久化)的完整解决方案与代码示例,旨在帮助数据分析师稳健获取评论数据,用于后续的文本挖掘与商业洞察。

weixin_29084111的博客 1921

从公式到实践:用SPSS解锁香农多样性指数的生态洞察

本文详细介绍了如何利用SPSS软件计算和应用香农多样性指数进行生态研究。从基础公式解析到SPSS实战操作,再到生态决策支持,全面展示了该指数在物种丰富度和均匀度量化中的价值。文章特别强调了SPSS操作中的关键技巧和常见误区,为生态研究者提供了一套完整的分析解决方案。

weixin_30832143的博客 465

run()和start()有啥区别,用run()启动线程行不行?以及创建线程的两种方法总结-线程与高并发

1、我用run()启动线程,不用start()行不行? 2、创建线程的两种方式中,都调用start()方法了,但有什么区别呢?

phs999的博客 233

ADS SerDes仿真实战:深入解析Tx_Diff均衡器(EQ)参数对眼图质量的影响

本文以ADS仿真平台为基础,深入解析了SerDes设计中Tx_Diff均衡器(EQ)参数对信号完整性的核心影响。通过实战演示,详细对比了去加重(De-emphasis)与FIR抽头系数两种调节模式,揭示了它们如何有效对抗信道损耗与码间干扰,从而显著改善眼图的高度、宽度与抖动性能,为高速串行链路设计提供关键调优思路。

weixin_29230901的博客 227

Thread启动线程start()和run()方法的区别

运行效果 两者都可以触发线程执行。 但run会立即同步执行、start异步执行。 1、start(): 用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到CPU时间片,就开始执行run()方法,这里方法run()称为线程...

Carlos的博客 681

一、永磁同步电机矢量控制——电机数学模型

本文介绍了永磁同步电机(PMSM)的数学模型构建方法,重点分析了不同坐标系(三相静止、α-β静止、d-q旋转)下的电压方程、磁链表达式及电磁转矩计算方法。通过Clark和Park变换简化非线性耦合系统,推导了表贴式(SPMSM)与内置式(IPMSM)电机的电压方程差异,并给出α-β和d-q坐标系下的转矩公式,强调磁链与电流的正交性对转矩的影响。全文基于理想假设,为后续电机控制算法(如FOC、DTC)提供理论基础。

惊鸿一现 1929

自动驾驶---Planning模块详细介绍(以Apollo为例)

主要介绍高速场景下Planning模块,至于低速的泊车场景对比高速场景或者城区场景有比较大的差距(后面也会介绍泊车场景),本篇Planning介绍主要包括三大子模块Routing,Behavioural Planning以及Motion Planining,并且对比较重要的Decider和Optimizer都做了通俗化的说明供大家思考,以便于后续理解更深入的内容,后面有时间会再开一些篇幅对这些模块进行更加深入的讲解。

智能汽车人的博客 2087

java启动线程用什么方法_Java中线程的run()方法和start()方法有什么区别?...

欢迎大家关注我的公众号"小猴子的技术笔记",有问题可以及时和我交流。由于Java是支持单继承的(接口除外),所以我们普遍启动线程的方式都是实现Runnable接口并重写run()方法。先来看下面一个简单的实例:public class MyRunnable implements Runnable {@Overridepublic void run() {try {// 睡眠3秒TimeUnit.S...

weixin_39815410的博客 220

学 Simulink—— 基于高频方波电压注入的表贴式永磁电机无感控制仿真

本文手把手教授基于Simulink的高频方波电压注入法实现表贴式永磁同步电机(SPMSM)无传感器控制。针对表贴式电机微弱凸极特性(Lq/Ld≈1.05-1.15),详解方波注入相比正弦注入的优势:通过5kHz方波(PWM频率半值)集中能量提升信噪比,并采用相邻周期电流直接相减的零延迟分离技术。系统架构包含高频注入器、无滤波器信号分离模块、锁相环观测器和磁饱和极性辨识等关键环节,提供参数设置经验(如注入幅值10-15%Vdc)和典型性能指标(位置误差<0.2rad)。特别强调工程实现要点:PWM同步时

xiaoheshang_123的博客 168

启动线程方法 start()和 run()有什么区别?

启动方式start():启动一个新的线程,并在新线程中执行run()方法。run():直接在当前线程中执行run()方法中的代码,不会启动新线程。线程调度start():由 JVM 负责调度新线程的执行。run():直接在当前线程中执行,不受 JVM 调度的影响。资源分配start():JVM 会为新线程分配必要的资源。run():不涉及额外的资源分配,只是在当前线程中执行代码。多线程特性start():支持多线程并发执行。run():不支持多线程并发执行,只是单线程顺序执行。

qq_33240556的博客 643

华为OD机试真题 新系统【Skill执行链完整性检测】

华为OD机试 新系统真题【Skill执行链完整性检测】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【Skill执行链完整性检测】

qq_45776114的博客 765

MIPI D-PHY的校准测试

MIPI的校准测试困扰了很久,今天终于得以解决!

一只豌豆象的博客 3922

Java线程中run()和start()方法讲解

文章目录一、run()方法二、start()方法三、run()和start()区别与联系 一、run()方法 方法介绍 public void run() /* 如果这个线程是使用单独的Runnable运行对象构造的, 则Runnable对象的run方法; 否则,此方法不执行任何操作并返回。 Thread的Thread应该覆盖此方法。 */ 简单举例 public class testRunAndStart { public static void main(String[] arg

weixin_44027397的博客 3602

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

[面试] Thread 中 start() 和 run() 的区别都不知道,还怎么混?

引子 最近面试了不少 Java 工程师,有一些心得体会想给大家分享,比如,上次就有一个小哥被我 “送走” 了,我尽量复原一下当时的面试情景,对话大致如下: 我:我们知道,JDK 中的线程 Thread 类有两个方法,一个叫 start(),一个叫 run(),那你知道两者有什么区别吗? 小哥:额......好像都是运行...运行一个线程吧...... 我:那都是运行一个线程的话,设计成一个方法就好...

weixin_30920597的博客 235

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

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

weixin_38568503的博客 8484

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

run()方法和start()方法的区别

一、start()和run()方法的区别: 1、start方法用来启动相应的线程; 2、run方法只是thread的一个普通方法,在主线程里执行; 3、需要并行处理的代码放在run方法中,start方法启动线程后自动调用run方法; 4、run方法必须是public的访问权限,返回类型为void。 二、进一步的理解 线程的run()方法是由java虚拟机直接调用的,如果我们没有...

Evan's Blog ٩(๑❛ᴗ❛๑)۶ 1万+

Thread 类中的start() 和 run() 方法有什么区别?

方法则是在当前线程中执行,不会创建新线程。方法仅仅是定义了线程的执行逻辑,在调用。方法用于启动一个新的线程并执行线程的。方法后由新线程执行,直接调用。方法是 Java 中。

NZC2237的博客 798

Java面试八股之start()和run()的区别

当调用线程对象的start()方法时,Java虚拟机会为该线程分配必要的系统资源(如栈空间),并将其置于可运行状态(Runnable),等待CPU调度执行。如果直接在主线程中调用某个线程对象的run()方法,那么run()中的代码将不会在新的线程中执行,而是作为普通方法在当前调用它的线程(通常是主线程)中顺序执行,这意味着没有实现多线程并行处理,程序仍按单线程的顺序执行路径进行。总结来说,start()方法用于启动线程,让JVM负责后续的线程调度和run()方法的调用,从而实现多线程并发;

u012151345的博客 448

线程的 run() 和 start() 有什么区别?

线程的 run() 和 start() 有什么区别? 调用 start() 方法是用来启动线程的,轮到该线程执行时,会自动调用 run();直接调用 run() 方法,无法达到启动多线程的目的,相当于主线程线性执行 Thread 对象的 run() 方法。 一个线程对线的 start() 方法只能调用一次,多次调用会抛出 java.lang.IllegalThreadStateExcept...

ConstXiong 2万+

线程中start方法和run方法的区别

线程中start方法和run方法的区别

qq_40649503的博客 1万+

start()和run()区别

线程

qq_42979823的博客 219

多线程——start()和run()

继线程的创建和启动,这篇博文主要讨论一下start()和run()这两个方法。 1. run()方法 在线程的创建和启动的总结中有说过:根据java api,Thread类本身也是实现了Runnable接口,有: public class Thread extends Object implements Runnable 现在来看一下Runnable接口,根据java api,Ru

gxx_csdn的博客 1万+
上一篇: String StringBuffer StringBuilder
下一篇: volatile
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值