当前位置: 首页 > news >正文

Java中线程启动:start()与run()方法的区别

Java中线程启动:start()与run()方法的区别

    • 1. `start()`方法
    • 2. `run()`方法
    • 3、总结
    • 4、示例对比


💖The Begin💖点点关注,收藏不迷路💖

线程是并发执行的基本单位,而Thread类则是实现多线程编程的核心。在使用Thread类或其子类创建线程时,start()run()是两个至关重要的方法,但它们的作用和调用方式却大相径庭。

1. start()方法

作用start()方法用于启动线程,使线程从新建状态(NEW)进入就绪状态(RUNNABLE),等待JVM的调度执行。一旦线程被启动,它将执行其run()方法中的代码。

关键特性

  • 调用start()后,线程的执行由JVM调度,具体何时执行、执行顺序均不确定。
  • 每个线程只能被启动一次,多次调用start()会抛出IllegalThreadStateException
  • start()是异步的,即调用后立即返回,线程在后台执行。

2. run()方法

作用run()方法是线程的主体,包含了线程需要执行的代码。但直接调用run()方法并不会启动新线程,而是像调用普通方法一样在当前线程中同步执行run()方法体内的代码。

关键特性

  • run()方法可以被直接调用,但这样做并不会创建新的线程,而是直接在调用它的线程中执行。
  • 如果想要在新线程中执行run()方法中的代码,必须通过start()方法启动线程。
  • run()方法的执行是同步的,即调用后等待其执行完成才继续执行后续代码(但这仅针对直接调用run()的情况,通过start()启动线程则不会阻塞)。

3、总结

1、简而言之,start()方法用于启动线程,让线程进入就绪状态等待JVM调度执行其run()方法中的代码;

2、而直接调用run()方法则是在当前线程中同步执行run()方法体内的代码,不会创建新线程。

4、示例对比

// 1、使用start()方法启动线程  
Thread thread = new Thread(() -> {  System.out.println("线程运行中...");  
});  
thread.start(); // 正确启动线程  // 2、直接调用run()方法  
Thread thread2 = new Thread(() -> {  System.out.println("这不是新线程,是直接在主线程中执行");  
});  
thread2.run(); // 直接在当前线程(主线程)中执行run()方法

在上面的示例中,thread.start()会启动一个新线程来执行打印操作,而thread2.run()则直接在主线程中执行打印操作,不会创建新线程。

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

相关文章:

  • 2024-07-12 Unity AI状态机1 —— 框架介绍
  • 案例|LabVIEW连接S7-1200PLC
  • pytorch说明
  • Java 实验三:数组操作以及Java中的方法
  • 解决方案架构师系列 - AWS - AWS Amplify 服务功能介绍
  • 【Linux取经之路】Linux常见指令
  • 关于windows下编译xLua插件的流程记录
  • 【Parallel SSH】Ubuntu系统配置pssh实现多主机并行执行Master分发的命令
  • 突破与创新:Vue.js 创始人 尤雨溪 2024 年度技术前瞻
  • Python - Word转TXT文本,或TXT文本转Word
  • AI大模型探索之旅:深潜大语言模型的训练秘境
  • 【Linux系列】TEE 命令:同时输出到终端和文件
  • C语言之qsort函数
  • Go语言 切片slice
  • mindspore打卡22天之基于MindSpore通过GPT实现情感分类
  • 2019.2.20 c++ 知识梳理
  • Java|序列化异常StreamCorruptedException的解决方法
  • jdbc就是这么简单
  • leetcode388. Longest Absolute File Path
  • passportjs 源码分析
  • PhantomJS 安装
  • socket.io+express实现聊天室的思考(三)
  • SQL 难点解决:记录的引用
  • windows下mongoDB的环境配置
  • 百度地图API标注+时间轴组件
  • 构建二叉树进行数值数组的去重及优化
  • 开源地图数据可视化库——mapnik
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 前端代码风格自动化系列(二)之Commitlint
  • 如何优雅地使用 Sublime Text
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 写代码的正确姿势
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 一道闭包题引发的思考
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 由插件封装引出的一丢丢思考
  • 1.Ext JS 建立web开发工程
  • ​ssh免密码登录设置及问题总结
  • ​数据结构之初始二叉树(3)
  • ​学习一下,什么是预包装食品?​
  • $(selector).each()和$.each()的区别
  • (02)vite环境变量配置
  • (07)Hive——窗口函数详解
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (C++20) consteval立即函数
  • (CPU/GPU)粒子继承贴图颜色发射
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (Matlab)使用竞争神经网络实现数据聚类
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (转)【Hibernate总结系列】使用举例
  • (转载)hibernate缓存
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .Net 8.0 新的变化