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

【AI Infra】Perfetto性能分析工具指南

Perfetto是一款开源性能分析工具,提供系统级和应用级的活动数据追踪功能。其界面分为四个区域:左侧操作区(包含Trace查看、SQL查询、预置分析等功能)、上方信息区、中间图形化展示区以及下方详细信息区。工具支持快捷键操作(w/s缩放、a/d移动、m标记等),并能高效处理大体积Trace文件。通过Timeline分析可发现性能瓶颈,如案例中update_actor耗时过高的问题,最终定位到CPU offloading导致的MemcpyH2D操作耗时过长,提出了优化方案。Perfetto相比Systrac

baiweizeng的博客 1510

Imputation Methods for scRNA Sequencing Data

越来越多的研究者使用单细胞RNA测序(scRNA-seq)技术来表征单细胞水平的转录图谱。他们用它来研究复杂组织的异质性、转录组动力学和未知生物的多样性。然而,在基因表达模式随机性的scRNA-seq数据中普遍存在许多技术和生物学上的噪音。这些数据通常具有高维、稀疏和大量“dropout”值的特点,并且受批处理效应的影响。scRNA-seq数据中大量的“dropout”值严重掩盖了基因之间的重要关系,阻碍了下游分析。因此,scRNA-seq数据dropout值的估算就显得尤为重要。

qq_34179307的博客 542

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

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

phs999的博客 233

大模型安全-生成检测-事实核查-攻击-防御-思考-记忆-融合-语音相关研究 2025年版

本文整理了关于大模型安全领域的综合性资源,包括7篇综述论文、9个安全数据集以及5篇强化学习相关的安全研究论文。主要涉及大模型的对抗攻击、隐私保护、安全评估等方向,涵盖TruthfulQA、ToxiGen等知名数据集和TrustLLM、HarmBench等关键研究。资源包括知乎博主分享、arXiv预印本和顶会论文,并附有详细的中文讲解链接,为研究者提供了系统性的安全研究参考。

CSPhD-winston的博客 3591

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

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

Carlos的博客 681

爬虫瑞数5案例:联通

瑞数动态安全 Botgate(机器人防火墙)以“动态安全”技术为核心,通过动态封装、动态验证、动态混淆、动态令牌等技术对服务器网页底层代码持续动态变换,增加服务器行为的“不可预测性”,实现了从用户端到服务器端的全方位“主动防护”,为各类 Web、HTML5 提供强大的安全保护。

老衲爱洗头的博客 4471

DeerFlow 系列教程 第三篇 | 核心技术深度剖析:Skills、Memory 与 Context Engineering

摘要化是 Context Engineering 中最关键的组件——它直接决定了长对话的可用性。Skills 技能系统通过渐进式加载的三层模型,在保持系统提示词轻量的同时,支持无限数量的技能扩展。从发现到执行的 10 个生命周期阶段,配合 AI 驱动的安全扫描和多层缓存,构成了一个生产级的技能管理框架。Memory 长期记忆系统通过文件系统持久化、LLM 驱动的信息提取和防抖动异步更新,实现了跨会话的认知持久化。六类事实分类体系和修正信号检测机制,让 Agent 能够从交互中持续学习和改进。

weixin_43674738的博客 280

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

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

weixin_39815410的博客 220

微信小程序 - 下单账号和支付账号不一致,请核实后再支付(微信小程序或微信H5页面/微信公众号网页支付时报错:“下单账号和支付账号不一致,请核实后再支付”,买家微信支付时提示错误)详细排查和解决方案!

微信支付出现 “下单账号与支付账号不一致,请核实后再支付”微信小程序下单账号与支付账号不一致不让支付,微信公众号网页 微信H5页面JS-SDK支付时出现错误:下单账号和支付账号不一致,请核实后再支付,openId导致的微信中“下单账号和支付账号不一致”原因及解决办法,调用统一下单所传openId与实际支付用户的openId不一致,微信支付jssdk报错,检查了没有不一致依然报错怎么办,微信支付下单账号和支付账号不一致,请核实后再支付,微信支付功能用JSAPI支付,H5页面负责下单并支付jsapi,微信调起支

🏆 前端领域优质创作者 5335

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

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

qq_33240556的博客 643

Mamba SSM 实战:IMDb 文本分类 + Mamba-ssm 全流程

Mamba SSM 文本分类链路:IMDb 二分类 → MambaLMHeadModel (d_model=256, n_layer=8, d_state=16, exp2=2) → 末 token 分类头。5 epoch 达 89.2% 准确率 (与 BERT-base 持平), 但显存降低 44% (3.5GB vs 6.2GB)。建议序列长度 ≥ 1024 再选 Mamba, 短序列 (< 512) 用 BERT 更高效。扩展时注意d_state。

m0_71589036的博客 57

ShaderJoy —— 简单又神奇的 “合体” 函数【GLSL】

smin 函数 它实际上有两种常见的实现方式 多项式 指数 多项式 smin 函数图 其对应的代码为 float smin( float a, float b ) { // 多项式 const float k = 0.5; float h = clamp(0.5 + 0.5 * (b - a) / k, 0.0, 1.0); return mix(b, a, h) - k * h * (1.0 - h); } 从上图中我们可以很明显的看出有两处不连...

ShaderJoy 的兴趣技术杂货铺 1858

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

VB摄像头监控

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

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

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

weixin_30920597的博客 235

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

weixin_38568503的博客 8484

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、付费专栏及课程。

余额充值