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

embedded/2024/11/30 12:44:31/

线程的run()方法和start()方法在Java多线程编程中具有显著的区别。以下是关于这两个方法区别的详细解释:

run()方法

  1. 定义
    • run()方法是Thread类中的一个普通方法,用于定义线程的主体逻辑,即线程需要执行的任务。
  2. 执行方式
    • 当直接调用run()方法时,它会在当前线程的上下文中执行,并不会创建一个新的线程。这意味着调用run()方法的代码将按顺序执行,就像调用一个普通方法一样。
  3. 并发性
    • 直接调用run()方法时,不会实现多线程的并发执行。所有代码都在调用run()方法的线程(通常是主线程)中顺序执行。
  4. 调用次数
    • run()方法可以多次调用,每次调用都会在当前线程中顺序执行其内部的代码。

start()方法

  1. 定义
    • start()方法是Thread类中的一个方法,用于启动一个新的线程。
  2. 执行方式
    • 当调用start()方法时,Java虚拟机(JVM)会创建一个新的线程,并在新线程的上下文中执行该线程的run()方法。这意味着调用start()方法后,新线程将开始执行其run()方法中的代码,而主线程将继续执行其后续的代码。
  3. 并发性
    • 调用start()方法会创建一个新的线程,从而实现多线程的并发执行。新线程和主线程(或其他线程)可以并行执行,提高程序的并发性能。
  4. 调用次数
    • 每个线程对象只能调用一次start()方法。如果尝试多次调用同一个线程的start()方法,会抛出IllegalThreadStateException异常。
  5. 异步性
    • start()方法是异步的,即它会立即返回并开始执行新的线程,而不需要等待新线程的run()方法执行完毕。

区别总结

以下是run()方法和start()方法的主要区别:

run()方法start()方法
定义定义线程的主体逻辑启动一个新线程
执行方式在当前线程中顺序执行创建新线程并在新线程中执行run()方法
并发性不实现并发执行实现多线程并发执行
新线程创建不会创建新线程会创建新线程
调用次数可以多次调用每个线程对象只能调用一次
异步性同步执行(直到方法完成才返回)异步执行(立即返回并开始执行新线程)

使用建议

  • 在编写多线程程序时,应该使用start()方法来启动新线程,而不是直接调用run()方法。
  • 直接调用run()方法不会创建新线程,也无法实现多线程的并发执行。
  • 确保每个线程对象只调用一次start()方法,以避免抛出IllegalThreadStateException异常。

通过理解run()方法和start()方法的区别,可以更好地编写和调试多线程程序,提高程序的并发性能和稳定性。


http://www.ppmy.cn/embedded/141747.html

相关文章

龙迅#LT6912适用于HDMI2.0转HDMI+LVDS/MIPI,分辨率高达4K60HZ,支持音频和HDCP2.2

1. 描述 LT6912是一款高性能的HDMI2.0转HDMI和LVDS和MIPI转换器。 HDMI2.0 输入和输出均支持高达 6Gbps 的数据速率,为4k60Hz视频提供足够的带宽。此外,还支持 HDCP2.2 进行数据解密(无数据 加密)。 对于 LVDS 输出&#xff0c…

Oracle12.2 RAC集群管理之增加删除节点(DNS解析)

Oracle12.2 RAC集群管理之增加删除节点 该章节实验是基于此章节基础上操作: Oracle LinuxR7安装Oracle 12.2 RAC集群实施(DNS解析)-CSDN博客 操作系统参数配置 172.30.21.101 hefei1 hefei1.hefeidb.com 172.30.21.102 hefei2 hef…

户外单兵拍摄神器——机器人云台

机器人选型 在户外拍摄移动镜头时,确保运镜的稳定性是一个复杂的任务。首先,需要使用高质量的稳定器或云台,以减少手持设备时的抖动。户外地形多变,如山坡或不平坦的地面,给摄影师的移动带来挑战,这要…

地理信息好书推荐 · 《基于C#与ArcGIS Engine 10》

GIS开发基础与C#语言入门 GIS开发基础:书中首先介绍了GIS开发的一些基本概念,比如GIS系统、空间数据模型、GIS功能等,为我们打下了坚实的基础。 C#语言入门:然后,书中带我们学习了C#语言的基础知识,包括数据…

docker使用(镜像、容器)

docker基础使用 文章目录 前言1.镜像操作1.1命令介绍1.2.案例实操1.2.1查找镜像1.2.2下载镜像1.2.3查看当前镜像 2.容器操作2.1命令2.1.1容器创建与启动2.1.2. 容器查看2.1.3. 容器操作2.1.4. 容器删除2.1.5. 容器日志2.1.6. 容器内文件操作2.1.7. 容器内命令执行2.1.8. 其他常…

挑战用React封装100个组件【001】

项目地址 https://github.com/hismeyy/react-component-100 组件描述 组件适用于需要展示图文信息的场景,比如产品介绍、用户卡片或任何带有标题、描述和可选图片的内容展示 样式展示 代码展示 InfoCard.tsx import ./InfoCard.cssinterface InfoCardProps {ti…

C++-function包装器的应用

目录 1.什么是 std::function? 2. function 包装器的原型 3.使用 function 封装不同类型的函数对象 代码分析 4.实际应用: 5. bind 绑定:修改参数传递顺序和数量 2.1 使用 bind 绑定修改参数传递顺序 2.2. bind 绑定:指定特定…

vue面试题+答案扩展(70道)

在当前前端领域,熟练使用Vue.js是非常重要的技能要求之一。针对Vue.js进行充分的面试准备,可以帮助求职者在众多应聘者中脱颖而出。本文准备了100道vue的面试题,点击链接后可以查看详细的原理,优势劣势、使用场景、代码示例等。 注…