【Java 基础】20 多线程操作方法
文章目录
- 1.获取和设置线程的名字
- 1)获取默认名字
- 2)获取自定义的名字
- 2.判断线程是否启动
- 3.线程的强制执行
- 4.让线程睡一会儿
- 5.中断线程
- 6.守护线程
- 7.线程的礼让
前一节我们介绍了线程的定义、创建方法、状态以及各状态间的转换。在状态转换处只是简单的说明了一下,比如从运行(Running)状态转换到就绪(Runnable)状态应该使用
yield()
方法来主动让出CPU时间 ,但是
yield()
方法是什么并没有说明,本节我们将接着前一节继续介绍一下常用的线程操作方法。
1.获取和设置线程的名字
在 Thread
类中我们可以使用 getName()
方法来获取线程的名字,如果想自己设定线程的名字还可以使用 setName()
方法。线程的名字通常在启动线程前进行设置,但是,运行中的线程也是可以为其设定名字的。如果没有设置名字的话,它会有一个默认的名字 Thread-xxx 。
1)获取默认名字
实例代码:
public class Demo {public static void main(String[] args) {ThreadDemo threadDemo = new ThreadDemo();new Thread(threadDemo).start();}
}
class ThreadDemo implements Runnable {@Overridepublic void run() {// 打印当前线程的名字System.out.println(Thread.currentThread().getName());}
}
输出结果:
Thread-0
2)获取自定义的名字
实例代码:
public class Demo {public static void main(String[] args) {ThreadDemo threadDemo = new ThreadDemo();// 创建线程并设置名字new Thread(threadDemo, "线程测试者").start();}
}class ThreadDemo implements Runnable {@Overridepublic void run() {// 打印当前线程的名字System.out.println(Thread.currentThread().getName());}
}
输出结果:
线程测试者
2.判断线程是否启动
通过 Thread
类中的 start()
方法可以启动一个线程,并且通知 CPU
这个线程已经准备就绪可以启动了,然后就坐等 CPU
为其分配资源运行啦。我们可以使用 isAlive()
方法来检测线程是否已启动并且扔在运行。
实例代码:
public class Demo {public static void main(String[] args) {ThreadDemo threadDemo = new ThreadDemo();Thread thread = new Thread(threadDemo);System.out.println("Before start isAlive():" + thread.isAlive());thread.start();System.out.println("After start isAlive():" + thread.isAlive());}
}class ThreadDemo implements Runnable {@Overridepublic void run() {System.out.println("Running...");}
}
输出结果:
Before start isAlive():false
After start isAlive():true
Running…
3.线程的强制执行
操作线程的时候,可以使用 join()
方法让一个线程强制运行,在此线程强制运行期间别的线程不能运行,必须等这个线程完成了才可以继续运行其他的。
观察 上一个 判断线程启动的示例,会发现 居然是 先输出 After 然后 才输出的 Running
那么能不能先强制执行 ThreadDemo 让 Running 在 After 之前呢?答案是可以的,使用 join() 方法强制运行即可
实例代码:
public class Demo {public static void main(String[] args) throws Exception {ThreadDemo threadDemo = new ThreadDemo();Thread thread = new Thread(threadDemo);System.out.println("Before start isAlive():" + thread.isAlive());thread.start();// 强制运行thread.join();// 此条代码就要等上面线程执行完成后,才可以执行,所以 isAlive() 也会是 falseSystem.out.println("After start isAlive():" + thread.isAlive());}
}class ThreadDemo implements Runnable {@Overridepublic void run() {System.out.println("Running...");}
}
输出结果:
Before start isAlive():false
Running…
After start isAlive():false
4.让线程睡一会儿
假如我们想让线程睡一会儿,则可以使用 Thread.sleep()
方法。
示例代码:
public class Demo {public static void main(String[] args) throws Exception {ThreadDemo threadDemo = new ThreadDemo();Thread thread = new Thread(threadDemo);thread.start();}
}class ThreadDemo implements Runnable {@Overridepublic void run() {try {// 先让我睡 5 秒for (int i = 0; i < 5; i++) {Thread.sleep(1000);System.out.println("睡了 " + (i + 1) + " 秒");}} catch (InterruptedException e) {throw new RuntimeException(e);}}
}
输出结果:
睡了 1 秒
睡了 2 秒
睡了 3 秒
睡了 4 秒
睡了 5 秒
5.中断线程
在一个线程正在运行的时候,其他线程可以使用 interrupt()
方法去中断它的运行状态。
观察 上一个 让线程睡一会儿的示例,一睡就要睡 5 秒
那么能不能睡2秒后提前把它喊醒?答案是可以的,使用 interrupt()
方法
示例代码:
public class Demo {public static void main(String[] args) throws Exception {ThreadDemo threadDemo = new ThreadDemo();Thread thread = new Thread(threadDemo);thread.start();// 在刚过 2 秒的时候,将其喊醒Thread.sleep(2001);thread.interrupt();}
}class ThreadDemo implements Runnable {@Overridepublic void run() {try {// 先让我睡 5 秒for (int i = 0; i < 5; i++) {Thread.sleep(1000);System.out.println("睡了 " + (i + 1) + " 秒");}} catch (InterruptedException e) {System.out.println("被其他人吵醒(中断)了");}}
}
输出结果:
睡了 1 秒
睡了 2 秒
被其他人吵醒(中断)了
6.守护线程
有时候我们只想要前台有一个线程在运行,则整个 Java
进程都不会消失,所以此时就需要一个守护线程,这样即使 Java
进程执行完结束了,那么这个守护线程依然在执行。这时候就可以使用 setDaemon()
方法啦。
示例代码:
public class Demo {public static void main(String[] args) {ThreadDemo threadDemo = new ThreadDemo();Thread thread = new Thread(threadDemo);thread.setDaemon(true);thread.start();}
}class ThreadDemo implements Runnable {@Overridepublic void run() {while (true) {try {Thread.sleep(5000);System.out.println("running");} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
此处 ThreadDemo 线程里面尽管是一个死循环,但程序依然可以执行完,因为这个方法中的死循环已经是去后台了,它不会阻止外面程序的结束。
7.线程的礼让
当一个线程在运行时,能不能让它先停下来一下,给其它线程一个运行的机会,这时候就可以使用 yield()
方法来暂时让出 CPU
的资源。
示例代码:
public class Demo {public static void main(String[] args) throws InterruptedException {ThreadDemo threadDemo = new ThreadDemo();Thread t1 = new Thread(threadDemo,"线程1");Thread t2 = new Thread(threadDemo,"线程2");t1.start();t2.start();t1.join();t2.join();}
}class ThreadDemo implements Runnable {@Overridepublic void run() {String tName = Thread.currentThread().getName();for (int i = 0; i < 5; i++) {System.out.println(tName + "运行第" + (i+1) + "次");if (i == 2) {System.out.println(tName + "主动让出");Thread.yield();}}}
}
输出结果:
线程2运行第1次
线程2运行第2次
线程2运行第3次
线程2主动让出
线程1运行第1次
线程1运行第2次
线程1运行第3次
线程1主动让出
线程2运行第4次
线程2运行第5次
线程1运行第4次
线程1运行第5次
从结果可以发现,当执行完 3 次之后,就把 CPU
资源让出来了,给其它线程一个可以执行的机会。
线程操作方法还有很多其他的,这里只列出来了几个常用的,好好去掌握可以更好的操作线程。
相关文章:
【Java 基础】20 多线程操作方法
文章目录 1.获取和设置线程的名字1)获取默认名字2)获取自定义的名字 2.判断线程是否启动3.线程的强制执行4.让线程睡一会儿5.中断线程6.守护线程7.线程的礼让 前一节我们介绍了线程的定义、创建方法、状态以及各状态间的转换。在状态转换处只是简单的说明…...
SpringBoot使用mybatis-plus分页查询无效解决方案
问题概述 SpringBoot中使用mybatis-plus实现分页查询时,提供一个page分页对象和一个QueryWrapper条件类对象,在使用Service.page(page,queryWrapper)方法进行分页查询时,发现并未查询到分页的结果,反而是查询到全部符合条件的结果…...
QT 中 线程池 (备查)
QRunnable类 API 1)在Qt中使用线程池需要先创建任务,添加到线程池中的每一个任务都需要是一个 QRunnable 类型,因此在程序中需要创建子类继承 QRunnable 这个类。 2)然后重写 run() 方法,在这个函数中编写要在线程池中…...
LeetCode刷题笔记第71题:简化路径
LeetCode刷题笔记第71题:简化路径 题目 给定一个路径,简化路径 要求: 1、以’/‘开头 2、两个目录之间只有一个’/’ 3、不能以’/‘结尾 4、路径中不能有’.‘和’…’ 想法 利用栈的数据存储方式的思想,将路径字符顺序入栈遇…...

JavaScript <md5加密的两种不同输出结果分析>--案例(二点一)
前言: 问题是这样的,在浏览器中看到这段代码 然后在控制台进行输出.得到: 紧接着,就在,js文件里面进行转译: 可是,得到的结果是: 这是问题!!! 正题: 为什么相同的js代码,在 .js 文件中的输出与 Chrome 控制台中的输出不一样? 环境差异:不同的JavaScript环境&…...

『亚马逊云科技产品测评』活动征文|基于亚马逊EC2云服务器配置Nginx静态网页
授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器(Elastic Compute Cloud)是亚马…...

28、卷积 - 卷积的基础公式
本节推导一下卷积的基础公式,还是先上一张卷积运算的示意图图。 我们知道,一张图片有 3 个维度,分别是长、宽、通道。 这三个维度分别用 3 个字母代替,分别是 H(Height, 对应的是长这一维度), W(Width, 对应的是宽这一维度),C(Channel,对应的是通道这一维度)。 对于…...

Mac电脑vm虚拟机 VMware Fusion Pro中文 for mac
VMware Fusion Pro是一款功能强大的虚拟机软件,适用于需要在Mac电脑上运行其他操作系统的用户。它具有广泛的支持、快速稳定的特点以及多种高级功能,可以满足用户的各种需求和场景。 多操作系统支持:VMware Fusion Pro允许在Mac电脑上运行多…...

区块链技术的应用场景和优势
目录 一、引言 二、什么是区块链技术 三、区块链技术的应用场景 1.金融领域 (1)支付和清算:区块链可以为支付和金融结算提供更加快速、安全、便捷的方式。例如瑞士银行UBS和Deutsche Bank已经合作开发了基于区块链的支付和清算系统。 &a…...
java面试题-谈谈sql优化-mysql
远离八股文,面试大白话,通俗且易懂 看完后试着用自己的话复述出来。有问题请指出,有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来,大家一起解决。 这是面试总结出来的几点,每次问道都是这么回…...

【Linux服务器Java环境搭建】07 在linux中安装MySql,以及对MySQL的配置与远程连接
【Linux服务器Java环境搭建】01购买云服务器以及在服务器中安装Linux系统 【Linux服务器Java环境搭建】02 通过xftp和xshell远程连接云服务器 【Linux服务器Java环境搭建】03 Git工具安装 【Linux服务器Java环境搭建】04 JDK安装(JAVA环境安装) 【Linux服…...

用 LangChain 搭建基于 Notion 文档的 RAG 应用
如何通过语言模型查询 Notion 文档?LangChain 和 Milvus 缺一不可。 在整个过程中,我们会将 LangChain 作为框架,Milvus 作为相似性搜索引擎,用二者搭建一个基本的检索增强生成(RAG)应用。在之前的文章中&a…...
QT中如何使用自定义控件
在 Qt 中,要使用自定义控件,需要遵循以下步骤: 创建自定义控件: 首先,需要创建一个自定义控件类,该类继承自 QWidget 或 QGraphicsItem 等基本控件类,并实现其相关函数和槽函数等。 在头文件中…...

xcode ——Instrumets(网络连接调试)使用
环境: instruments 使用只能在真机调试时使用,且真机系统必须ios15 点击debug 按钮——Network——Profile in Instruments 然后就可以看到如下面板 展开运行的项目,点击session下的域名,下方回出现该域名下的网络请求。点击Deve…...

Ps:文字操作常用快捷键
对文字的设置操作,可在工具选项栏或“字符”面板上进行。但是,如果能记住并使用快捷键,可大大提高工作效率。 设置文字颜色 Color 1、选中几个或全部文字后,除了使用工具选项栏上的“颜色”按钮,还可以使用快捷键 Alt…...

SpringSecurity的默认登录页的使用
SpringSecurity的默认登录页的使用 01 前期准备 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--mysql驱动--><dependency><grou…...

【Rust日报】2023-12-04 slint 成功案例
slint 成功案例 SK Signet是美国领先的电动车充电解决方案提供商,推出了适用于其电动车充电桩的新型HMI(人机界面)。支持15英寸和32英寸触摸屏。 该HMI由Slint制作,为充电站运营商提供了额外的商机。SK Signet经理Sang-Baek Lee表…...

嵌入式硬件和软件哪个好?
嵌入式硬件和软件哪个好? 嵌入式软硬件工程师哪个更有前途呢?一起来看看。 嵌入式是分为软硬件工程师的,首先我们先来看看嵌入式硬件工程师吧! 嵌入式硬件开发工程师主要编写嵌入式系统硬件总体方案和详细方案,要求理解嵌入式系统架构,有一…...

MySQL 8.x 自签证书通过keytool和openssl转成JKS文件
一、写在前面 数据库MySQL 8.0 通过自签命令在datadir下生成了所有的证书文件。由于Java的JDK不支持直接加载PEM格式的证书,所以需要将PEM格式证书转换成Java能够直接加载的JKS格式证书。我们需要将根证书ca.pem转换成JKS格式的根证书truststore.jks,将…...

MybatisPlus概述
MybatisPlus概述 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作强大的 CRUD 操作:内置通用 Mapper、通…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...

Qwen系列之Qwen3解读:最强开源模型的细节拆解
文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...

Element-Plus:popconfirm与tooltip一起使用不生效?
你们好,我是金金金。 场景 我正在使用Element-plus组件库当中的el-popconfirm和el-tooltip,产品要求是两个需要结合一起使用,也就是鼠标悬浮上去有提示文字,并且点击之后需要出现气泡确认框 代码 <el-popconfirm title"是…...