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

【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#架构图 可以记住电脑上鼠标、键盘操作记录,用处就很多,比较灵活了&#xff0c…...

谷歌、微软、Meta?谁才是 Python 最大的金主?

你知道维护 Python 这个大规模的开源项目,每年需要多少资金吗? 答案是:约 200 万美元! PSF(Python 软件基金会)在 2022 年 6 月发布了 2021 的年度报告,其中披露了以下这份支出明细&#xff08…...

面向对象笔记

标准JavaBean类1.类名见名知意2.成员变量由private修饰3.提供两个构造方法 无参构造和带全部参数构造4.提供每一个成员变量对应的set/get方法5.如果有其它行为,也要写上空参构造 初始化默认值带参构造 初始化参数 创建对象由虚拟机调用,不能手动调用每创…...

tofu:一款功能强大的模块化Windows文件系统安全测试工具

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

VS中scanf为什么会报错

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

使用kubeadm部署k8s1.24.0版本,遇到的坑总结

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

【C++】特殊类设计

&#x1f308;欢迎来到C专栏~~特殊类设计 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&a…...

中创教育PMP如何轻松应对公司90%以上的沟通难题

掌握沟通技能&#xff0c;可以让问题从1变成0&#xff1b; 掌握沟通技能&#xff0c;可以让机会从0变成1&#xff1b; 掌握沟通技能&#xff0c;可以让成功从1变成100&#xff1b; 难题一、当领导问你某件事&#xff0c;但你又不太清楚时 【说话公式】需要思考需要确认晚点回…...

#笨鸟先飞# 数据结构与算法基础 课程笔记 第六章 图

图的定义和基本术语图&#xff1a;G( V , E ) Graph&#xff08;Vertex&#xff0c;Edge&#xff09;V&#xff1a;顶点&#xff08;数据元素&#xff09;的有穷非空集合&#xff1b;E&#xff1a;边的有穷集合。无向图&#xff1a;每条边都是无方向的有向图&#xff1a;每条边…...

告别乱码困扰:GBKtoUTF-8编码转换工具全方位指南

告别乱码困扰&#xff1a;GBKtoUTF-8编码转换工具全方位指南 【免费下载链接】GBKtoUTF-8 To transcode text files from GBK to UTF-8 项目地址: https://gitcode.com/gh_mirrors/gb/GBKtoUTF-8 你是否曾遇到过这样的场景&#xff1f;从旧系统导出的文档在Mac上打开变成…...

手把手教你用PCI Geomatica处理Pleiades三线阵影像:从GCP刺点到DEM滤波的完整避坑指南

高分辨率卫星立体像对处理实战&#xff1a;PCI Geomatica全流程精解与避坑策略 当Pleiades三线阵影像遇上PCI Geomatica&#xff0c;会碰撞出怎样的火花&#xff1f;作为遥感数据处理领域的"瑞士军刀"&#xff0c;Geomatica在立体像对处理上展现出的专业深度&#xf…...

独立开发者如何借助Taotoken以更低成本体验多种大模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 独立开发者如何借助Taotoken以更低成本体验多种大模型 对于独立开发者或个人项目而言&#xff0c;技术选型与成本控制是项目初期面…...

Display Driver Uninstaller (DDU):彻底清理显卡驱动的终极解决方案

Display Driver Uninstaller (DDU)&#xff1a;彻底清理显卡驱动的终极解决方案 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers…...

2026最权威的六大AI写作平台解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 作为智能写作工具来讲的 DeepSeek&#xff0c;能够高效地促进学术论文撰写效率有所提升。于选…...

ML管道自动化:构建端到端的机器学习工作流

ML管道自动化&#xff1a;构建端到端的机器学习工作流 一、ML管道自动化概述 1.1 ML管道的定义 ML管道是一系列机器学习任务的组合&#xff0c;包括数据收集、数据预处理、特征工程、模型训练、模型评估和模型部署等步骤。ML管道自动化则是通过工具和框架自动执行这些步骤的过程…...

终极Word转LaTeX神器:5分钟搞定专业文档格式转换

终极Word转LaTeX神器&#xff1a;5分钟搞定专业文档格式转换 【免费下载链接】docx2tex Converts Microsoft Word docx to LaTeX 项目地址: https://gitcode.com/gh_mirrors/do/docx2tex 还在为Word文档转换为LaTeX格式而烦恼吗&#xff1f;每次手动调整公式、表格和图片…...

终极视频加速神器:如何用Video Speed Controller提升300%学习效率

终极视频加速神器&#xff1a;如何用Video Speed Controller提升300%学习效率 【免费下载链接】videospeed HTML5 video speed controller (for Google Chrome) 项目地址: https://gitcode.com/gh_mirrors/vi/videospeed 你是否曾因视频播放速度太慢而浪费宝贵时间&…...

深入剖析`ReentrantReadWriteLock`源码——虚拟线程时代机遇、挑战与演进

引言&#xff1a;并发范式的革命性转变 Java 21 正式引入了虚拟线程&#xff08;Virtual Threads&#xff09;&#xff0c;这标志着 Java 并发编程进入了一个全新的时代。Project Loom 的目标是让编写、维护和观测高吞吐量的并发应用程序变得如同编写顺序代码一样简单。虚拟线程…...

在RK3399上跑通ORB-SLAM2和VINS-MONO,我踩过的那些坑(含RealSense D435i兼容性测试)

在RK3399上部署ORB-SLAM2与VINS-MONO的避坑实战指南 引言 当视觉SLAM算法遇上嵌入式平台&#xff0c;总会碰撞出意想不到的火花。作为一名长期在边缘计算设备上折腾SLAM算法的开发者&#xff0c;我最近在RK3399这块性能强劲的ARM开发板上部署ORB-SLAM2和VINS-MONO时&#xff0c…...