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

408——计算机组成原理(持续更新)

小数点前的0代表正数,1代表负数。

qq_55202378的博客 1723

SAP Business One自定义表与字段实战:从零构建企业专属数据模型

本文详细介绍了如何在SAP Business One中创建自定义表与字段,从零构建企业专属数据模型。通过实战案例和避坑指南,帮助用户掌握业务适配、流程优化和权限隔离等关键技巧,提升系统灵活性和数据管理效率。特别适合需要扩展标准功能的SAP Business One用户。

weixin_28730927的博客 362

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

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

phs999的博客 233

Windows下构建ImGui.Net

工具 Visual Studio 2017 操作 下载项目 git clone https://github.com/mellinoe/ImGui.NET.git 编译 右键以下两个项目并调试: ImGui.NET.SampleProgram ImGui.NET.SampleProgram.XNA Error fix 中间遇到一些问题: SDK版本不对 去微软官网下载安装对应版本 由于设置了代理被远程服务器拒绝连接 关闭代理(也许在环境变量中) nuget源无对应资源,404 NOT FOUN

jojozym的博客 1489

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

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

Carlos的博客 681

测绘无人船避坑指南:云卓H12Pro遥控器接海康摄像头,从网络设置到RTSP流延迟优化全流程

本文详细解析了测绘无人船视频子系统的优化方案,重点介绍海康威视摄像头与云卓H12Pro遥控器的深度适配流程。从网络设置到RTSP流延迟优化,提供了一套经过实测的低延迟(<200ms)解决方案,适用于复杂水域环境下的测绘任务。

weixin_30415113的博客 627

C#与YOLOv8工业缺陷检测实战:从算法到PLC集成的工程化落地

目标检测作为计算机视觉的核心任务,其原理是通过深度学习模型在图像中定位并识别物体。这项技术的关键价值在于将AI的感知能力转化为实际生产力,尤其在工业自动化领域,它能实现高效、精准的视觉检测。在工业缺陷检测这一典型应用场景中,稳定性和实时性是核心挑战。本文聚焦于如何将YOLOv8这一先进的目标检测模型,与C#上位机开发及工业相机硬件深度集成,构建一个能够7x24小时稳定运行的智能检测系统。文章深入探讨了从模型训练、ONNX部署,到与PLC通信联调的完整工程化路径,并针对工业环境中常见的稳定性、性能及调试问题提

weixin_33508411的博客 236

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

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

weixin_39815410的博客 220

c语言串口编程详解

串口: 一种异步通信接口,通常用于低速数据传输。RS-232: 最常见的串口标准,定义了电气特性、连接器和信号线。UART: 通用异步收发传输器,是实现串口通信的硬件模块。通过以上内容,你应能够理解并实现C语言在Windows和Linux平台上的串口编程。希望这本手册能帮助你在实际项目中顺利进行串口通信开发。如果有任何疑问或需要进一步的帮助,请随时提问。

jkzyx123的博客 2224

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

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

qq_33240556的博客 643

Web3前沿技术的智能合约安全审计

随着Web3技术的快速发展,智能合约作为区块链应用的核心组件,其安全性问题日益突出。本文旨在系统性地介绍智能合约安全审计的技术体系,帮助开发者理解智能合约安全风险,掌握安全审计的方法论和工具链。智能合约安全的基本概念常见漏洞类型及其原理安全审计的技术方法实际审计案例分析安全审计工具和资源首先介绍基本概念和背景然后分析常见漏洞和安全风险接着详细讲解安全审计技术提供实际案例和代码示例最后讨论工具资源和未来趋势智能合约:运行在区块链上的自执行程序,代码即法律安全审计。

AI天才研究院 1547

PCL 点云圆柱形邻域搜索【2026最新版】

圆柱形邻域搜索是KD-tree算法在点云数据处理中的扩展应用,在一些特定场景应用中具有无与伦比的优势。博客长期更新,本文最近一次更新时间为:2026年5月4日。

点云侠的博客 3451

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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

weixin_30920597的博客 235

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

weixin_38568503的博客 8484

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

余额充值