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

在Java多线程编程中,Thread类是一个非常重要的类,它提供了创建和管理线程的能力。对于初学者来说,理解Thread类的start()方法和run()方法之间的区别尤为重要。本文将深入探讨这两者之间的不同,帮助读者更好地掌握Java多线程编程的基础知识。

引言
在Java中,Thread类是创建新线程的基础。通过继承Thread类并重写其run()方法,或者实现Runnable接口并将其实例作为Thread的构造器参数,我们可以定义线程执行的任务。然而,仅仅定义了任务(即run()方法)并不足以启动线程,还需要通过调用start()方法来实现。(上面绿色背景的内容是可以用来创建线程的几种方法)

 1.start() 方法

1.1功能描述

start()方法是用来启动线程的。当调用线程的start()方法时,Java虚拟机(JVM)会为该线程分配必要的资源,并创建一个新的调用栈。然后,JVM会将该线程的run()方法放到新创建的调用栈中,并由Java虚拟机通过该线程来执行这个run()方法。

1.2 重要特性
异步执行:start()方法会立即返回,而run()方法在新的线程中异步执行。
线程状态:调用start()方法后,线程的状态会从NEW变为RUNNABLE,准备执行。
只能调用一次:每个线程只能调用一次start()方法,再次调用将抛出IllegalThreadStateException.

对于上述所写的每个线程只能调用一次start解释

解释一(接下来的内容小编用大白话为大家解释方便理解):一个Thread的对象对应于一个线程,也就是说如果  实例对象.start()  了两次,就代表一个对象对应于两个线程,同理如果   对象.start()   多次的话就会有对应很多的线程这样的话会使得对象不好管理多个线程。

解释二 

具体的原因可以通过start方法的源码来查看:

由上图我们得知不能重复调用start方法的原因   在于每次调用start函数之前需要判断start的状态是否为新建状态NEW(对应上面判断是为否0),如果不为新建状态NEW 就会抛出异常“IllegalThreadStateException”,当start被调用之后此线程的状态会被调整为就绪状态RUNNABLE,每次在进行调用start方法之前都会检查start函数的状态是什么,如果start的状态为“RUNNABLE”那么便不会开启线程,同时会进行异常(IllegalThreadStateException)的抛出 。

2.run() 方法

2.1 功能描述

run()方法是线程需要执行的任务的入口点。它是Thread类中的一个方法,通常被重写以包含线程的具体工作(又名线程体)。然而,直接调用线程的run()方法并不会启动新线程,而是在当前线程中同步执行run()方法体内的代码。

2.2 调用方式
直接调用:直接调用某个线程的run()方法,实际上是在当前线程中执行该run()方法,并不会启动新线程。
通过start()间接调用:通过调用线程的start()方法,JVM会间接调用该线程的run()方法,但此时run()方法是在新线程中执行的。

3. 两者区别总结

目的不同start()方法用于启动线程,而run()方法定义了线程执行的任务
执行方式不同:start()方法导致run()方法在新线程中异步执行(下面有解释),而直接调用run()方法则是在当前线程中同步执行。
线程状态影响:调用start()方法会改变线程的状态,并启动线程的执行流程;而调用run()方法则不会。
使用限制:start()方法在一个线程的生命周期中只能被调用一次;而run()方法则可以被任意次调用(尽管直接调用通常不符合多线程编程的初衷)

异步执行

异步执行的含义:异步执行意味着一个任务(或操作)可以在不阻塞主线程(或调用线程)的情况下执行。在多线程环境中,当你启动一个线程去执行 run() 方法中的代码时,这个任务就在新的线程中异步执行了,因为主线程(或调用线程)可以继续执行其他任务,而不需要等待这个新线程完成。
异步执行是计算机程序中的一种重要执行方式,它通过将耗时或等待时间长的任务放入任务队列中,并在主线程空闲时处理这些任务,从而提高了程序的执行效率和响应速度。

4. 结论

理解start()方法和run()方法之间的区别对于掌握Java多线程编程至关重要。start()方法是启动新线程的关键,而run()方法则是定义线程具体任务的地方。确保在正确的上下文中使用它们,可以帮助我们编写出高效、可靠的多线程应用程序。

以上就是分享的全部内容,希望对大家有所帮助~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3226375.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

web端的vscode编辑器

下载code-server到本地 略 参考 https://blog.csdn.net/kfashfasf/article/details/137110668 运行code-server 到用户目录下设置 vim ~/.config/code-server/config.yaml . bind-addr: 0.0.0.0:8080 auth: password password: xxxxxx cert: false运行 [centosamazon22 ~…

中职网络安全wire0077数据包分析

从靶机服务器的FTP上下载wire0077.pcap,分析该文件,找出黑客入侵使用的协议,提交协议名称 SMTP 分析该文件,找出黑客入侵获取的zip压缩包,提交压缩包文件名 DESKTOP-M1JC4XX_2020_09_24_22_43_12.zip 分析该文件&…

使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-滚动背景(四)

文章目录 开发思路开发思路 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击(一) 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-激光组件(二) 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-飞船动画&#xff08…

pytorch-RNN实战-正弦曲线预测

目录 1. 正弦数据生成2. 构建网络3. 训练4. 预测5. 完整代码6. 结果展示 1. 正弦数据生成 曲线如下图: 代码如下图: 50个点构成一个正弦曲线随机生成一个0~3之间的一个值(随机的原因是防止每次都从相同的点开始,50个点的正弦曲…

JavaSE 面向对象程序设计进阶 IO流 字节流详解 抛出异常

input output 像水流一样读取数据 存储和读取数据的解决方案 内存中数据不能永久化存储 程序停止运行 数据消失 File只能对文件本身进行操作 不能读写文件里存储的数据 读写数据必须要有IO流 可以把程序中的数据保存到文件当中 还可以把本地文件中的数据读取到数据当中 分…

白酒营销策划全攻略:从市场调研到执行落地的实战指南!

为白酒品牌做营销策划,那可得像给自家的孩子挑衣服一样,得量身定制,得考虑孩子的身材、喜好,还得看看衣服的款式和布料。 这里可以分享一点自己多年的实战干货给你,希望对你有所帮助。 首先,得做好“侦查…

【常见开源库的二次开发】一文学懂CJSON

简介: JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript的一个子集,但是JSON是独立于语言的,这意味着尽管JSON是由JavaScript语法衍生出来的,它可以被任何编程语言读取和生成…

CentOS7系统上安装MySQL8.0(rpm-bundle.tar)详细过程

一、MySQL官网下载安装包 1.进入官网MySQL :: Download MySQL Community Server 2.查看自己的版本和架构 uname -mcat /etc/redhat-release 3.选择对应版本并下载 4.查看linux自带的mariadb数据库,有就卸载掉。 rpm -qa | grep mariadbrpm -e mariadb-libs…

【卡尔曼滤波】高斯白噪声

生成高斯白噪声并将其应用于信号处理 生成高斯白噪声并将其应用于信号处理 #以下是一个生成高斯白噪声并将其应用于信号处理的示例代码:import numpy as np import matplotlib.pyplot as plt import matplotlib.font_manager ## not work#notice matplotlibrc is a file, not…

学生选课管理系统(Java+MySQL)

技术栈 Java: 用于实现系统的核心业务逻辑。MySQL: 作为关系型数据库,用于存储系统中的数据。JDBC: 用于Java程序与MySQL数据库之间的连接和交互。Swing GUI: 用于创建图形用户界面,提升用户体验。 系统功能 我们的学生选课管理系统主要针对学生和管理…

突破传统:实现智慧校园实习单位变更

在智慧校园的实习管理系统设计中,充分考虑到了实习阶段学生可能遇到的实际需求,特别是实习单位变更这一灵活性要求,系统特设了一套完善的在线处理机制,旨在促进学生、学校与企业间的顺畅沟通与协调,确保实习过程的平稳…

Gmail邮件提醒通知如何设置?有哪些方法?

Gmail邮件提醒通知功能怎么样?通知邮件怎么有效发送? Gmail作为全球广泛使用的电子邮件服务,提供了多种邮件提醒通知功能,帮助用户不错过重要信息。AokSend将详细介绍如何设置Gmail邮件提醒通知,确保您不会错过任何重…

IT审计必看!对比旧版,CISA考试改版升级亮点和重点内容是什么?

官方通知,今年8月1日,CISA新版考纲正式上线,旧版在7月23日后就无法约考了。 艾威培训邀请了国内知名的IT审计CISA授课老师吴老师来为大家详细讲解CISA新版考纲的变化 目前第28th版教材只有英文版,中文版尚未发布。我们艾威经验丰…

【NOI-题解】1108 - 正整数N转换成一个二进制数1290 - 二进制转换十进制1386 - 小丽找半个回文数1405 - 小丽找潜在的素数?

文章目录 一、前言二、问题问题:1108 - 正整数N转换成一个二进制数问题:1290 - 二进制转换十进制问题:1386 - 小丽找半个回文数问题:1405 - 小丽找潜在的素数? 三、感谢 一、前言 本章节主要对进制转换的题目进行讲解…

【UNI-APP】阿里NLS一句话听写typescript模块

阿里提供的demo代码都是javascript,自己捏个轮子。参考着自己写了一个阿里巴巴一句话听写Nls的typescript模块。VUE3的组合式API形式 startClient:开始听写,注意下一步要尽快开启识别和传数据,否则6秒后会关闭 startRecognition…

javascript高级部分笔记

javascript高级部分 Function方法 与 函数式编程 call 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象。 说明:call 方法可以用来代替另一个对象调用一个方法。cal…

侯捷C++面向对象高级编程(下)-2-non-explicit one argument constructor

1.构造函数 构造函数: Fraction(int num, int den 1) 初始化分子和分母,允许指定分子 num 和可选的分母 den。默认情况下,分母为 1。 加法运算符重载: Fraction operator(const Fraction& f) 重载了加法运算符 。这使得两个 Fraction 对象可以通过 …

NodeJS校园快递智能互助平台-计算机毕业设计源码58554

摘 要 随着校园人口的增加和生活节奏的加快,校园快递成为一个重要的服务需求。然而,传统的校园快递方式存在一些问题,例如无法满足快速和高效的需求,易发生丢失或损坏的情况,同时也给快递人员和用户带来不便。因此&am…

成功登上主要中心化交易所 (CEX) 的终极指南:从准备到上市的全面策略

对于区块链项目的创始人而言,成功的代币发行是项目发展的关键一步。尤其是在主要中心化交易所 (CEX) 上上市代币,可以极大地提高项目的曝光度和流动性。然而,CEX 上市过程复杂且充满挑战,需要创始人提前做好充分准备。本文将详细介…

JavaSE语法 | 初识Java!!!

初识Java 一、Java开发环境二、初步认识Java的main方法2.1 main方法的实现2.2 运行Java程序 三、注释四、标识符五、关键字 一、Java开发环境 IDEA版本:IntelliJ IDEA Community Edition 2022.3.3 JDK17 Windows 11 二、初步认识Java的main方法 2.1 main方法的实…