【Java|多线程与高并发】详解start()方法和run()方法的区别
文章目录
- 前言
- 1.start()方法和run()方法
- 2.不能两次调用start()方法
- 3.线程的执行是随机的
- start()方法和run()方法的执行顺序不一定相同
- 4.run()方法由JVM调用
- public Thread(Runnable target)中的target
前言
本篇文章主要讲解以下几个问题:
- start()方法和run()方法的区别与联系
- 为什么不能连续两次调用shart()方法
- run()方法中可能忽略的问题
1.start()方法和run()方法
我们在创建线程时,会重写run()方法.run()方法可以理解为线程要做的任务,但是直接调用run()方法,只是main线程也就是主线程去执行的,是没有新线程产生的
如果要想让线程去执行run()方法里面的代码,就需要让创建线程的对象去调用start()方法,shart()方法可以创建并启动线程,JVM调用run()方法后(后面会有介绍) 线程才会去执行
2.不能两次调用start()方法
同一个线程对象,只能调用一次start()方法,不能两次调用start()方法,调用两次的话,会抛出 IllegalThreadStateException 这个异常
示例如下:
public class Example6 {public static void main(String[] args) {Thread t1 = new Thread(()->{System.out.println("1");});t1.start();t1.start();}
}
为什么会这样?我们可以查看start()的源码
上面有一段话: A zero status value corresponds to state "NEW" 意思是 零状态值对应于状态“NEW”
线程运行时有六种状态,先熟悉一下,之后还会写文章进行详细介绍:
状态 | 描述 |
---|---|
新建(NEW) | 表示线程已经创建好了,但是还没有调用start()方法 |
就绪(RUNNABLE) | 表示线程可能在运行,也可能在就绪队列 |
阻塞 (BLOCKED) | 表示线程处于等在锁的状态 |
等待(WAITING) | 表示线程处于条件等待状态,当触发条件后会唤醒 |
计时等待(TIME_WAIT) | 比WAITING多了个超时条件触发的机制 |
终止(TERMINATED) | 表示线程执行结束 |
因此线程再调用start()方法之后,可能处于终止,或者其它非NEW状态,第二次调用的时候,相当于重新让线程运行一遍,从线程安全和线程本身的执行逻辑来看,都是不合理的,因此在调用start()方法之后,会对线程的状态进行一个判断,如果线程不是在NEW状态下,就会抛出异常
3.线程的执行是随机的
线程的执行是随机的,这也是个老生常谈的问腿了,究其原因还是因为线程的"抢占式执行",谁先"抢"到
操作系统分配的CPU资源,谁先去执行
start()方法和run()方法的执行顺序不一定相同
示例1:
看一下代码及代码运行结果
class MyThread extends Thread{private int val;public MyThread(int val) {this.val = val;}@Overridepublic void run() {System.out.println(val);}
}
public class Example1 {public static void main(String[] args) {MyThread myThread1 = new MyThread(1);MyThread myThread2 = new MyThread(2);MyThread myThread3 = new MyThread(3);MyThread myThread4 = new MyThread(4);MyThread myThread5 = new MyThread(5);myThread1.start();myThread2.start();myThread3.start();myThread4.start();myThread5.start();}
}
由此我们可以看到虽然是myThread1先调用的start()方法,但是输出的结果却是在第二位,而myThread3后执行却在第一位
再次运行一次代码的执行结果虽然与上次不同,但仍然是随机的,当然也不是没有运行结果是1 2 3 4 5的可能
示例2:
看一下代码及代码运行结果
public class Example4 {public static void main(String[] args) {Thread t1 = new Thread(()->{while (true){System.out.println("t1");}});Thread t2 = new Thread(()->{while (true){System.out.println("t2");}});t1.start();t2.start();}
}
这里我们也能看到,start()执行的顺序与run()方法执行的顺序无关,随机执行t1和t2的run()方法 虽然这里是while(true),但是线程之间是相互独立的,所以并不影响
因此可以得出结论:start()方法和run()方法的执行顺序不一定相同
4.run()方法由JVM调用
start()执行完后,创建的新线程不会立刻去执行run()方法, run()方法会先被JVM去调用,之后对应的线程才会去执行.
public Thread(Runnable target)中的target
之前再讲创建线程的5种方法,介绍了实现Runnable接口,创建线程的方法
但其实这里面有一个坑,那就是public Thread(Runnable target)中的target参数,来看一下run()方法的底层源码
如果这里面的target不为空,才会去执行target的run()方法
.如果传一个null,就不会去执行,如图所示:
代码如下:
class MyRunnable implements Runnable{@Overridepublic void run() {System.out.println("1");}
}
public class Example7 {public static void main(String[] args) {MyRunnable myRunnable1 = new MyRunnable();MyRunnable myRunnable2 = null;Thread t1 = new Thread(myRunnable1);t1.start();Thread t2 = new Thread(myRunnable2);t2.start();}
}
因此要注意使用继承Runnable接口 创建线程的时候 要注意target不要为null
文章到这里去结束了,感谢观看!
“希望你继续兴致盎然的与世界交手,一直走在充满鲜花的道路”
相关文章:

【Java|多线程与高并发】详解start()方法和run()方法的区别
文章目录前言1.start()方法和run()方法2.不能两次调用start()方法3.线程的执行是随机的start()方法和run()方法的执行顺序不一定相同4.run()方法由JVM调用public Thread(Runnable target)中的target前言 本篇文章主要讲解以下几个问题: start()方法和run()方法的区别与联系为…...
mysql 一些有意思的sql语句,备忘
### 批量插入 INSERT INTO 表名 (字段列表) VALUES (字段对应的值),(字段对应的值),(字段对应的值),(字段对应的值), js 代码示例: function batchAddOrde…...

hive自定义函数
hive自定义函数 hive内置的函数满足不了所有的业务需求,可以考虑自己定义函数 UDF:一对一输出(upper) UDTF:一对多输出 (lateral view explode) UDAF:多对一输出(count, max, min) 自定义UDF 用java实现一个UDF 引入依赖 …...

数仓理论【范式】【维度建模】
数仓理论 1 范式理论 1.1 范式概念 数据建模要遵循一定的规则,在关系建模中,这种规则就是范式 采用范式结构,可以有效的降低数据的冗余性 范式在获取数据时,需要通过join拼接出数据 范式有第一范式(1NF),第二范式…...

卷积神经网络
卷积神经网络1. 卷积神经网络边缘检测示例Padding卷积步长三维卷积单层卷积网络简单卷积网络示例池化层卷积神经网络示例2. 深度卷积网络经典网络残差网络残差网络为什么有用1 x 1 卷积谷歌Inception 网络介绍Inception 网络迁移学习数据扩充(数据增强)3…...
解决Qt提示xxx.so not found( using -rpath or -rpath-link)问题
问题描述: 在QtCreator中交叉编译的时候突然出现了以下动态库找不到的问题: 我这里是aarch64,其他环境类似即可。 /usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/bin/ld: warning: libwrap.so.0, needed by /home.../../nfsdir///libpulsecommo…...

Blazor 托管模型 BlazorWebAssembly和Blazor Server
BlazorWebAssembly 应用 BlazorWebAssembly 应用使用基于 WebAssembly 的 .NET 运行时在浏览器中直接执行。 BlazorWebAssembly 应用的工作方式类似于 Angular 和 React 等前端 JavaScript 框架。 但不是编写 JavaScript,而是编写 C#。 .NET 运行时与应用、应用程序…...

从未想过制作数据可视化展示竟可以如此简单
还在跟着网络上一节课好几个小时的付费课程学习如何制作数据可视化大屏嘛?还在为不知道怎么设计数据展示排版而苦恼?今天教大家用最简单的方式制作一个数据可视化大屏,首先让我们看一下参考大屏样式:接下来我们将制作数据可视化大…...

企业电子招投标采购系统源码之功能模块的描述
功能模块: 待办消息,招标公告,中标公告,信息发布 描述: 全过程数字化采购管理,打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力,为外部供…...
LeetCode-2341. 数组能形成多少数对【哈希表,计数】
LeetCode-2341. 数组能形成多少数对【哈希表,计数】题目描述:解题思路一:哈希表,将数组中的数加入哈希表中,若有两个相同的数就记录下来,并消去两个。最后只需遍历哈希表中置为1的个数即可。解题思路二&…...

vue-echarts实现多功能图表
前言作为前端人员,日常图表、报表、地图的接触可谓相当频繁,今天小编隆重退出前端框架之VUE结合百度echart实现中国地图各种图表的展示与使用;作为“你值得拥有”专栏阶段性末篇,值得一看主要实现功能——中国地图——环形图——折…...
C#快键精灵
我发过挺多工作中用到的C#内容,整体链接和内容去这里看下:C#基础知识体系框架图,及起对应我发过的博客_花开莫与流年错_的博客-CSDN博客_c#架构图 可以记住电脑上鼠标、键盘操作记录,用处就很多,比较灵活了,…...

谷歌、微软、Meta?谁才是 Python 最大的金主?
你知道维护 Python 这个大规模的开源项目,每年需要多少资金吗? 答案是:约 200 万美元! PSF(Python 软件基金会)在 2022 年 6 月发布了 2021 的年度报告,其中披露了以下这份支出明细(…...
面向对象笔记
标准JavaBean类1.类名见名知意2.成员变量由private修饰3.提供两个构造方法 无参构造和带全部参数构造4.提供每一个成员变量对应的set/get方法5.如果有其它行为,也要写上空参构造 初始化默认值带参构造 初始化参数 创建对象由虚拟机调用,不能手动调用每创…...

tofu:一款功能强大的模块化Windows文件系统安全测试工具
关于tofu tofu是一款功能强大的针对Windows文件系统安全的模块化工具,该工具可以使用离线方法对目标Windows文件系统进行渗透测试,并通过绕过Windows系统登录界面来帮助广大研究人员测试Windows主机的安全性。除此之外,该工具还可以执行哈希…...

VS中scanf为什么会报错
简单来讲,scanf会强行输入内容,所以是不安全的。 我们来看这样的例子: #include <iostream> using namespace std;int main() {char demo[3];scanf("%s", demo);return 0; }对于以上代码,当我们输入字符不超过3时…...

使用kubeadm部署k8s1.24.0版本,遇到的坑总结
使用kubeadm部署k8s1.24.0版本,遇到的坑总结环境安装遇到的问题环境 操作系统:centos7 内核:5.4.231-1.el7.elrepo.x86_64 kubeadm:1.24.0 kubelet:1.24.0 kubectl:1.24.0 cri:docker cni&…...

【C++】特殊类设计
🌈欢迎来到C专栏~~特殊类设计 (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort目前状态:大三非科班啃C中🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自己的一句鸡汤&a…...
中创教育PMP如何轻松应对公司90%以上的沟通难题
掌握沟通技能,可以让问题从1变成0; 掌握沟通技能,可以让机会从0变成1; 掌握沟通技能,可以让成功从1变成100; 难题一、当领导问你某件事,但你又不太清楚时 【说话公式】需要思考需要确认晚点回…...

#笨鸟先飞# 数据结构与算法基础 课程笔记 第六章 图
图的定义和基本术语图:G( V , E ) Graph(Vertex,Edge)V:顶点(数据元素)的有穷非空集合;E:边的有穷集合。无向图:每条边都是无方向的有向图:每条边…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...