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

多线程之旅:属性及其基本操作

上次分享到了,多线程中是是如何创建的,那么接下来,小编继续分享下多线程的相关知识。

多线程中的一些基本属性。

基本属性

属性获取方法
IDgetId()
名称getName()
状态getState()
优先级getPriority()
是否后台线程isDemo()
是否存活isAlive()
是否被中断isInterrupted()

 那么其中这些属性名称有着什么意思呢?

ID:是线程唯一的标识,不同线程不会重复

这里是jvm自动分配的,不能手动设置

名称:是各种调试工具用到的东西,可以帮助调试和日志记录

Thread对象的身份标识

状态:表示线程当前所处的一个情况

一般初学听的更多是就绪/阻塞

后面详细介绍。

优先级:影响线程调度一个工具,理论上来说,优先级高的更容易被调度到

设置不同的优先级,会影响系统的调度,这里的影响有着多种因素:

操作系统调度算法、优先级映射……

后台线程:特殊类型的线程,主要是为程序提高服务和支持功能。

有着后台线程,那么也有着前台线程

那么又是前台线程呢?

前台线程也是一个特殊线程,默认创建的。

有个值得注意的,前台线程会影响jvm的退出,前台线程结束后,jvm才会退出。

后台线程是不会影响jvm的退出的。

存活:可以简单理解为,执行run方法是否结束了

线程中断:用于请求线程停止当前工作的一种机制

ok,接下来以一个代码来演示下

public static void main(String[] args) {Thread t=new Thread(()->{while (true){System.out.println("hello world");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();//获取线程属性//获取IDSystem.out.println("ID:"+t.getId());//线程名字System.out.println("name:"+t.getName());//线程状态System.out.println("状态:"+t.getState());//线程优先级System.out.println("优先级:"+t.getPriority());//是否是后台线程System.out.println("前台/后台:"+t.isDaemon());//是否存活System.out.println("是否存活:"+t.isAlive());//是否被中断System.out.println("是否被中断:"+t.isInterrupted());}

在代码运行期间,截了以下的运行图:

从运行结果来看,ID被jvm自动分配为:22

name被jvm自动填充为Thread-0

这里值得注意的是,main方法也是一个线程,还是个主线程,而且有着自己独属的名字

就直接命名为main

而后创建的线程从Thread-n开始(这是默认填充名字),n从0开始

状态则显示为TIMED_WAITING

这里简单介绍下这里的几种状态:

状态含义例子
NEW线程被创建但尚未启动新买的车还没发动。
RUNNABLE线程正在执行或准备执行车辆在路上行驶。
BLOCKED线程等待获取锁等待电梯开门。
WAITING线程无限期等待另一个线程执行特定操作在咖啡店等朋友,不确定他们什么时候到。
TIMED_WAITING线程等待一段时间后继续执行在咖啡店等朋友,但只愿意等 10 分钟
TERMINATED线程已完成执行,不能再次启动完成购物并离开商店。

从图中可以看到优先级为5

那么此时这个5是什么意思呢?

在Java的优先级中,优先级是一个整数值,范围到MIN_PRIORITY(1)->MAX_PRIORITY(10);

  • Thread.MIN_PRIORITY: 最低优先级,值为 1。
  • Thread.NORM_PRIORITY: 默认优先级,值为 5。
  • Thread.MAX_PRIORITY: 最高优先级,值为 10。

接着看到是否存活,很显然,线程run方法执行的内容是死循环,所以是存在这个线程,即存活

值得注意的是,我们是通过创建线程对象,任何才有通过对象,去创建线程。

那么此时,可能会出现Thread对象存在,但是线程是不存在的了(注意:是不会出现,线程存在,Thread对象不存在的)

比如:1.调用start之前,内核中,还没创建线程呢

           2.线程中的run方法执行完毕了,内核中的线程自然就无了,但此时Thread对象,仍然存在

是否被中断,这里的中断内容,后续会讲到。

那么接下来讲讲这个线程的一些核心操作

一些核心操作

1.线程创建

这个前一篇文章已经讲述过了噢,那么接下来仅仅补充下

这个线程创建,即是调用这个start方法,那么值得注意的是,start方法不能启动多次,只能一次,

因为一个Thread对象,对应一个线程,在jvm中。

多次启动后的报错信息

还有就是,在线程中是可以启动其他线程的,也可以创建其他线程的

不只是在main方法中去创建线程。

2.线程的中断

即是一个线程结束

在java中,这个线程中断结束,是比较温柔的做法 ,假设B正在运行,那么此时,A想让B结束,

那么A就是想办法,把B的run() 方法运行完即可。

这里有一个简单直接的做法可以演示

public class Demo11 {private static boolean isQuit=false;public static void main(String[] args) throws InterruptedException {//不能写在内部,因为我们下面创建线程任务是使用lambda表达式,写在内部涉及到变量捕获
//        boolean isQuit=false;Thread t=new Thread(()->{while (!isQuit){System.out.println("hello world");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();Thread.sleep(2000);//在这里影响t线程结束isQuit=true;System.out.println("t线程结束!");}
}

当然,还有一个方法,就是通过Thread.currentThread()获取到当前线程的实例,去判断下是否被中断了

 public static void main(String[] args) throws InterruptedException {Thread t=new Thread(()->{//获取当前线程的引用Thread currentThread=Thread.currentThread();//默认为falsewhile (!currentThread.isInterrupted()){System.out.println("hello world");try {Thread.sleep(1000);} catch (InterruptedException e) {System.out.println("catch语句已执行!");break;
//                   throw new RuntimeException(e);}}});t.start();Thread.sleep(4000);//这里来控制t线程结束,调用后,currentThread.isInterrupted()返回truet.interrupt();}

此时为什么会执行到catch语句的内容呢?

这是因为在主线程中呢,t.interrupt();会让这个中断标志设置为true,一开始为false。

那么此时t线程中的,sleep()正在休眠,此时会导致sleep()抛出InterruptedException,此时呢,就会执行到catch语句代码

值得注意的是,sleep()唤醒后,又会重新设置这个中断标志位,即恢复默认情况

那么此时如若我们呢catch语句没有中断操作,除了它,它还是会继续打印hello world代码。

所以Interrupt方法能够设置标志位,也能唤醒sleep等阻塞方法

而且sleep方法唤醒后,又能清空标志位。

3.线程等待

我们之前讲到,这个操作系统针对多个线程的执行,是一个随机调度,抢占式执行的过程。

那么这个线程等待呢,就是确定两个线程的“结束顺序”

比如A线程中调用B.join(),那么这个意思就是让A线程等待B线程 先结束,然后再执行A线程的内容

这个join就是线程等待的关键字。

我们可以使用一个代码来演示下

 public static void main(String[] args) throws InterruptedException {Thread t1=new Thread(()->{for(int i=0;i<4;i++){System.out.println("hello t1");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});Thread t2=new Thread(()->{for(int i=0;i<=4;i++){System.out.println("hello t2");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t1.start();t2.start();t1.join();t2.join();

所以运行结果中,可能会带着交替出现的效果。

由于是线程是随机调度的,所以打印结果,有可能使交替出现,也有可能不是。

这里我们使main主线程等待t1、t2线程

那么其实也可以t1等待t2线程,或者也可以t2等待t1,甚至多个线程进行等待

那么刚刚使用的这个是无参版本的,

那么此时这个join有可能就是会出现死等的情况,有时候往往不是一个好选择

所以java这里呢,提供了两个带参数的版本

public void join(long millis)等待线程结束,最多等待millis毫秒
public void join(long millis,int nanos)同理,但是提供的精度会更高

所以我们如若使用到这个带参数的版本,这样等预定的时间过后,就会执行其他任务了,而不是死等了。

完~

相关文章:

多线程之旅:属性及其基本操作

上次分享到了&#xff0c;多线程中是是如何创建的&#xff0c;那么接下来&#xff0c;小编继续分享下多线程的相关知识。 多线程中的一些基本属性。 基本属性 属性获取方法IDgetId()名称getName()状态getState()优先级getPriority()是否后台线程isDemo()是否存活isAlive()是…...

数据表中的数据插入、更新和删除

文章目录 一、表的插入二、更新表中的数据记录三、删除表中的数据记录 一、表的插入 插入数据记录是常见的数据操作&#xff0c;可以显示向表中增加的新的数据记录。在MySQL中可以通过“INSERT INTO”语句来实现插入数据记录&#xff0c;该SQL语句可以通过如下4种方式使用&…...

Q_OBJECT宏报错的问题

在Qt中继承QObject&#xff0c;并且加上Q_OBJECT宏&#xff0c;有时候会报错&#xff0c;比如我的错误&#xff1a; error: debug/httpmgr.o:httpmgr.cpp:(.rdata$.refptr._ZTV7HttpMgr[.refptr._ZTV7HttpMgr]0x0): undefined reference to vtable for HttpMgr 意思是没有虚…...

提升性能300ms:深入解析Spring多表联接查询优化与SQL调优实战

优化所需知识点&#xff08;必须掌握&#xff09; 索引篇 explain命令 重点&#xff1a;这是后续分析是否使用索引以及使用是否恰当的工具 作用&#xff1a;查看sql的执行计划&#xff0c;可以看sql语句是否使用了索引&#xff0c;索引的使用情况&#xff0c;以及sql的性能。 …...

增量导入和全量导入的区别是什么?

定义 全量导入&#xff1a;是指将数据源中的所有数据一次性全部导入到目标系统中。例如&#xff0c;一个电商公司要将其旧数据库中的所有商品信息&#xff08;包括商品名称、价格、库存等&#xff09;全部迁移到新的数据库系统中&#xff0c;这个过程就是全量导入。这种方式会覆…...

【百度智能云客悦智能客服】搭建AI agent智能对话 - 购车推荐

前期准备 平台链接&#xff1a;https://keyue.cloud.baidu.com/ 一、开始创建 二、会话流程配置 我们以购车推荐的案例&#xff0c;来进行 AI agent 配置演示 1.添加开场白 在 起始主题 画布中&#xff0c;我们可以配置 AI agent 的开场白&#xff0c;画布左侧默认有 开始 …...

【HTML+CSS+JS+VUE】web前端教程-3-标题标签

标题介绍与应用 标题是通过<h1>-<h6>标签进行定义的 <h1>定义最大的标题 <h6>定义最小的标题<h1...

逐笔成交逐笔委托Level2高频数据下载和分析:20250102

level2逐笔成交逐笔委托下载 链接: https://pan.baidu.com/s/1p7OOj5p-QGFrWkt6KKoYng?pwd7f4g 提取码: 7f4g Level2逐笔成交逐笔委托数据分享下载 通过Level2逐笔成交和逐笔委托这种每一笔的毫秒级别的数据可以分析出很多有用的点&#xff0c;包括主力意图&#xff0c;虚假动…...

JavaEE之线程池

前面我们了解了多个任务可以通过创建多个线程去处理&#xff0c;达到节约时间的效果&#xff0c;但是每一次的线程创建和销毁也是会消耗计算机资源的&#xff0c;那么我们是否可以将线程进阶一下&#xff0c;让消耗计算机的资源尽可能缩小呢&#xff1f;线程池可以达到此效果&a…...

java 中 main 方法使用 KafkaConsumer 拉取 kafka 消息如何禁止输出 debug 日志

pom 依赖&#xff1a; <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.5.14.RELEASE</version> </dependency> 或者 <dependency><groupId>org.ap…...

【后端面试总结】Golang可能的内存泄漏场景及应对策略

Golang可能的内存泄漏场景及应对策略 一、引言 Golang作为一种高性能、并发友好的编程语言&#xff0c;其内置的垃圾回收机制极大地简化了内存管理。然而&#xff0c;这并不意味着开发者可以完全忽视内存泄漏问题。在实际开发中&#xff0c;由于不当的资源管理、循环引用、以…...

Java 反射机制详解

在 Java 编程世界中&#xff0c;反射机制犹如一把神奇的钥匙&#xff0c;它能够打开许多隐藏在代码深处的 “大门”&#xff0c;让开发者突破常规的限制&#xff0c;实现一些极具灵活性的功能。今天&#xff0c;就跟随我一同深入探究 Java 反射机制的奥秘。 一、什么是反射 反…...

【k8s】scc权限 restricted、anyuid、privileged

文章目录 概述1. 内置的scc2. OpenShift如何确定pod的scc2.1 Pod未带SCC标签的情况2.2. Pod带有SCC标签的情况 参考 概述 在OpenShift&#xff08;后文简称OCP&#xff09;中&#xff0c;很早就一个概念&#xff1a;Security Context Constraints &#xff0c;简称SCC&#xf…...

2025华数杯国际赛A题完整论文讲解(含每一问python代码+数据+可视化图)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2025“华数杯”国际大学生数学建模竞赛A题Can He Swim Faster的完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文…...

ThreadLocal 的使用场景

在现代电商平台中&#xff0c;ThreadLocal 常用于以下场景&#xff0c;特别是与线程隔离相关的业务中&#xff0c;以提高性能和简化上下文传递。 1. 用户上下文信息管理 场景&#xff1a;在用户发起的每次请求中&#xff0c;需要携带用户 ID、角色、权限等信息&#xff0c;而这…...

后端开发 Springboot整合Redis Spring Data Redis 模板

目录 redis 配置 RedisConfig 类 完整代码 代码讲解 1. 类定义和注解 2. 定义 RedisTemplate Bean 3. 配置 JSON 序列化 4. 配置 Redis 的 key 和 value 序列化方式 5. 完成配置并返回 RedisTemplate 总结 redis 服务接口实现类 类级别 注入 RedisTemplate 常用 Re…...

代码随想录算法训练营第 4 天(链表 2)| 24. 两两交换链表中的节点19.删除链表的倒数第N个节点 -

一、24. 两两交换链表中的节点 题目&#xff1a;24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 视频&#xff1a;帮你把链表细节学清楚&#xff01; | LeetCode&#xff1a;24. 两两交换链表中的节点_哔哩哔哩_bilibili 讲解&#xff1a;代码随想录 dummy-…...

【RDMA学习笔记】1:RDMA(Remote Direct Memory Access)介绍

从帝国理工的PPT学习。 什么是RDMA Remote Direct Memory Access&#xff0c;也就是Remote的DMA&#xff0c;是一种硬件机制&#xff0c;能直接访问远端结点的内存&#xff0c;而不需要处理器介入。 其中&#xff1a; Remote&#xff1a;跨node进行数据传输Direct&#xff…...

网络安全常见的35个安全框架及模型

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 01、概述 网络安全专业机构制定的一套标准、准则和程序&#xff0c;旨在帮助组织了解和管理面临的网络安全风险。优秀的安全框架及模型应该为用户提供一种可靠方法&#xff0c;帮助其实现网络安全建设…...

Elasticsearch介绍及使用

Elasticsearch 是一款基于 Lucene 库构建的开源、分布式、RESTful 风格的搜索引擎和分析引擎&#xff0c;具有强大的全文搜索、数据分析、机器学习等功能&#xff0c;广泛应用于日志分析、实时数据分析、全文检索等场景。 核心概念 索引&#xff08;Index&#xff09;&#xf…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...