【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、通…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...
用鸿蒙HarmonyOS5实现国际象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的国际象棋小游戏的完整实现代码,使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├── …...
IP选择注意事项
IP选择注意事项 MTP、FTP、EFUSE、EMEMORY选择时,需要考虑以下参数,然后确定后选择IP。 容量工作电压范围温度范围擦除、烧写速度/耗时读取所有bit的时间待机功耗擦写、烧写功耗面积所需要的mask layer...