【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、通…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
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…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...
