JavaWeb5-线程常用属性
目录
1.ID
2.名称
3.状态
4.优先级
5.是否守护线程
5.1.线程类型:
①用户线程(main线程默认是用户线程)
②守护线程(后台/系统线程)
5.2.守护线程作用
5.3.守护线程应用
5.4.守护线程使用
①在用户线程(main线程)中创建的子线程默认情况下也是用户线程
②在守护线程中创建的子线程默认情况下也是守护线程
③守护线程和用户线程的区别
6.是否存活
7.是否被中断
PS:线程执行顺序or随机判断准则
1.ID
是线程的唯⼀标识,不同线程ID不会重复,是动态分配的。(相当于进程PID)
2.名称
是各种调试⼯具⽤到,默认不同线程名称是不同的,但若手动指定不同线程名称可以重复。
/*** 线程属性:id、name*/
public class ThreadDemo13 {public static void main(String[] args) throws InterruptedException {Runnable runnable = new Runnable() {@Overridepublic void run() {//得到执行当前任务的线程Thread t = Thread.currentThread();//打印线程id(是long类型)System.out.println("线程ID:" + t.getId());//打印线程名称System.out.println("线程名称:" + t.getName());}};Thread thread = new Thread(runnable,"线程1");thread.start();Thread.sleep(500);System.out.println();Thread thread2 = new Thread(runnable,"线程1");thread2.start();}
}
3.状态
表示线程当前所处的⼀个情况。
/*** 线程状态的流转*/
public class ThreadDemoByState {public static void main(String[] args) throws InterruptedException {Thread t = new Thread(new Runnable() {@Overridepublic void run() {//拿到当前线程,并打印当前线程的状态Thread thread = Thread.currentThread();System.out.println("线程状态2:" + thread.getState());}});//打印线程的状态System.out.println("线程状态:" + t.getState());t.start();//再次打印线程状态Thread.sleep(500);System.out.println("线程状态3:" + t.getState());}
}

4.优先级
优先级⾼的线程理论上来说更容易被调度到。
线程创建之后,优先级就已经存在了。
/*** 获取线程优先级*/
public class ThreadDemoByPriority {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {//得到当前线程,并打印线程优先级Thread t = Thread.currentThread();System.out.println("线程优先级:" + t.getPriority());}});System.out.println("线程优先级2:" + thread.getPriority());thread.start();Thread.sleep(500);System.out.println("线程优先级3:" + thread.getPriority());}
}

线程优先级是int类型值,为1-10,最小优先级是1,最高优先级是10,默认优先级是5。

设置线程优先级(2种):
t1.setPriority(Thread.MAX_PRIORITY);
t1.setPriority(10);
/*** 设置线程优先级*/
public class ThreadDemoByPriority2 {private final static int MAX_COUNT = 7;public static void main(String[] args) {Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {//得到当前线程Thread t = Thread.currentThread();//得到线程的优先级int priority = t.getPriority();for (int i = 0; i < MAX_COUNT; i++) {System.out.println(t.getName() + "——优先级:" + priority);}}},"线程1");//设置线程优先级(2种写法)
// t1.setPriority(10); //直接赋值t1.setPriority(Thread.MAX_PRIORITY); //枚举Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {Thread t = Thread.currentThread();int priority = t.getPriority();for (int i = 0; i < MAX_COUNT; i++) {System.out.println(t.getName() + "——优先级:" + priority);}}},"线程2");t2.setPriority(Thread.MIN_PRIORITY);Thread t3 = new Thread(new Runnable() {@Overridepublic void run() {Thread t = Thread.currentThread();int priority = t.getPriority();for (int i = 0; i < MAX_COUNT; i++) {System.out.println(t.getName() + "——优先级:" + priority);}}},"线程3");t3.setPriority(Thread.NORM_PRIORITY);//同时启动线程(非常快,可以认为是同时的)t2.start();t1.start();t3.start();}
}

多个线程设置了不同的优先级,同时启动这多个线程,并不是优先级最高的一定先执行完之后再执行优先级最低的线程,而是高优先级获取到CPU时间片的概率更多,整个执行大致符合高优先级的线程最先执行完。
快捷键设置:
ctrl+F查找
ctrl+H替换
5.是否守护线程
5.1.线程类型:
①用户线程(main线程默认是用户线程)
程序员创建的线程。
②守护线程(后台/系统线程)
5.2.守护线程作用
守护线程是为⽤户线程服务的,当一个程序中的所有⽤户线程全部结束之后,守护线程会跟随结束。
5.3.守护线程应用
JVM 中的垃圾回收器就是典型的守护线程,程序运⾏的时候它也运⾏,当满⾜条件时进⾏垃圾回收,在一个进程中所有非后台线程执⾏完任务终⽌时它才会结束运行。
5.4.守护线程使用
//获取当前线程是否是守护线程
thread.isDaemon()
//true->守护线程; false->用户线程
//手动指定线程类型
t1.setDaemon(true);
//true->守护线程; false->用户线程
①在用户线程(main线程)中创建的子线程默认情况下也是用户线程
/*** 守护线程示例*/
public class ThreadDemoByDaemon {public static void main(String[] args) {//得到当前的线程(main主线程)Thread thread = Thread.currentThread();System.out.println("是否是守护线程:" + thread.isDaemon());Thread t1 = new Thread(() -> {//得到当前线程Thread cThread = Thread.currentThread();System.out.println(cThread.getName() + "——是否是守护线程:" + thread.isDaemon());},"子线程1");t1.start(); //启动线程}
}

②在守护线程中创建的子线程默认情况下也是守护线程
/*** 守护线程示例*/
public class ThreadDemoByDaemon {public static void main(String[] args) throws InterruptedException {//得到当前的线程(main主线程)Thread thread = Thread.currentThread();System.out.println(thread.getName() + "——是否是守护线程:" + thread.isDaemon());Thread t1 = new Thread(() -> {//得到当前线程Thread cThread = Thread.currentThread();System.out.println(cThread.getName() + "——是否是守护线程:" + cThread.isDaemon());//创建子线程Thread tt1 = new Thread(() -> {Thread cThread2 = Thread.currentThread();System.out.println(cThread2.getName() + "——是否是守护线程:" + cThread2.isDaemon());},"子线程的子线程1");tt1.start();},"子线程1");//手动指定线程为守护线程t1.setDaemon(true);t1.start(); //启动线程//主线程休眠1sThread.sleep(1000);}
}
注:线程类型(用户or守护)不能在线程运行期间,也就是调用了 start() 之后设置,否则JVM会报错。
③守护线程和用户线程的区别
/*** 对比用户线程和守护线程的区别*/
public class ThreadDemoByDaemon2 {public static void main(String[] args) throws InterruptedException {userThread();daemonThread();}/*** 用户线程*/private static void userThread() {Thread thread = new Thread(() -> {for (int i = 0; i < 10; i++) {System.out.println("用户线程执行:" + i);try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}}});thread.start();}/*** 守护线程*/private static void daemonThread() {Thread t = new Thread(() -> {for (int i = 0; i < 10; i++) {System.out.println("守护线程执行:" + i);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}});//设置为守护线程t.setDaemon(true);//启动线程t.start();}
}

结论:JVM会等待所有的用户线程执行完再自然退出,但JVM不会等待守护线程执行完再退出。若用户线程没执行完强制退出,JVM也会退出。
线程的类型和线程的调度无关,只有线程的优先级和线程的调度有关。
6.是否存活
简单的理解为 run ⽅法是否运⾏结束了。
public class ThreadDemoByAlive {public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {Thread thread = Thread.currentThread();System.out.println("线程是否存活2:" + thread.isAlive());});System.out.println("线程是否存活:" + t.isAlive());t.start();System.out.println("线程是否存活3:" + t.isAlive());Thread.sleep(1000);System.out.println("线程是否存活4:" + t.isAlive());}
}
使用场景:
public class ThreadDemoByAlive {public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {for (int i = 0; i < 10; i++) {try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("1:线程执行完了!");});t.start();while(t.isAlive()){}System.out.println("2:确认线程执行完了!");}
}
7.是否被中断
线程在休眠或执行当中,其他线程可以操作此线程让其中断。
PS:线程执行顺序or随机判断准则
- 在一个线程里的执行顺序是从上往下的。
- 多个线程之间的执行是随机的,因为线程调度是随机的。
public class ThreadDemo13 {public static void main(String[] args) throws InterruptedException {Runnable runnable = new Runnable() {@Overridepublic void run() {//得到执行当前任务的线程Thread t = Thread.currentThread();//打印线程id(是long类型)System.out.println(t.getName() + "——线程ID:" + t.getId());//①//打印线程名称System.out.println(t.getName() + "——线程名称:" + t.getName());//②//打印线程优先级System.out.println(t.getName() + "——线程优先级:" + t.getPriority());//③}};Thread thread = new Thread(runnable,"线程1");thread.start();Thread thread2 = new Thread(runnable,"线程2");thread2.start();Thread thread3 = new Thread(runnable,"线程3");thread3.start();} }
相关文章:
JavaWeb5-线程常用属性
目录 1.ID 2.名称 3.状态 4.优先级 5.是否守护线程 5.1.线程类型: ①用户线程(main线程默认是用户线程) ②守护线程(后台/系统线程) 5.2.守护线程作用 5.3.守护线程应用 5.4.守护线程使用 ①在用户线程&am…...
JVM调优及垃圾回收GC
一、说一说JVM的内存模型。JVM的运行时内存也叫做JVM堆,从GC的角度可以将JVM分为新生代、老年代和永久代。其中新生代默认占1/3堆内存空间,老年代默认占2/3堆内存空间,永久代占非常少的对内存空间。新生代又分为Eden区、SurvivorFrom区和Surv…...
JAVA练习53-打乱数组
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、题目-打乱数组 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 提示:这里可以添加本文要记录的大概内容: 2月17日练习内…...
基于RK3588的嵌入式linux系统开发(三)——Uboot镜像文件合成
本章uboot镜像文件的合成包括官网必备文件rkbin下载和uboot镜像文件合成两部分内容,具体分别如下所述。 (一)下载rkbin文件包 以上uboot编译生成的uboot镜像不能直接烧录到板卡中运行,需要与atf、bl31、ddr配置文件等必备文件合成…...
wireshark抓包后通过工具分包
分包说明:关于现场问题分析,一般都是通过日志,这个属于程序中加的打印,或存数据库,或者存文本形式,这种一般比较符合程序逻辑;还有一种就是涉及到网络通信方面的,需要通过抓包来分析…...
举个栗子~Tableau 技巧(251):统一多个工作表的坐标轴范围
在工作汇报场景,有一个很常见、很多数据粉反馈的需求:同一看板上的两个图表,因为轴范围不一致(如下图),很难直观比较。有什么办法可以统一它们的坐标轴范围呢? 类似需求,不论两个还是…...
Centos7 调整磁盘空间
1. 查看磁盘空间占用情况: df -h 可以看到 /home 有很多剩余空间,占了绝大部分, 而我又很少把文件放在home下。 2. 备份 /home 下的内容: cp -r /home/ /homebak/ 3. 关闭home进程: fuser -m -v -i -k /home 报错: -bash: fuser…...
小菜版考试系统——“C”
各位CSDN的uu们你们好呀,今天,小雅兰的内容是小菜版考试系统,最近一直在忙C语言课程设计的事,那么,就请uu们看看我的学习成果吧。 课程设计任务 摘要 题目分析 流程图 关键程序代码 程序运行结果 结论与心得 参…...
Twitter被封号了?最详细的申诉教程在此
由于Twitter检测系统是十分敏感的,所以在运营的时候很容易莫名就出现“此账号被封禁”或者“此账号被冻结”的情况。出现这种情况大多是因为账号发送了垃圾信息、面临安全风险、发太多广告或者太久没上线被判为机器人这几个原因。被封号后,我们可以通过向…...
Docker 安装配置
本章背景知识 本章主要介绍在 Centos 操作系统平台上进行安装和配置Docker Engine。 环境准备 1、操作系统支持。 CentOS、Debian、Fedora、Raspbian、RHEL、SLES、Ubuntu、Binaries 2、启用yum 软件仓库源。 centos-extras 编者注:Centos 默认已经开启cento…...
死锁检测组件-设想
死锁检测组件-设想 现在有三个临界资源和三把锁绑定了,三把锁又分别被三个线程占用。(不用关注临界资源,因为锁和临界资源是绑定的) 但现在出现这种情况:线程1去申请获取锁2,线程2申请获取锁3,…...
线程池的使用
为什么要使用线程池 复习一下创建线程的几种方式: 继承Thread 实现Runnable 实现Callable 但是如果频繁的创建/销毁线程,就会造成资源浪费。这时候就需要将线程创建好之后存起来,以后要用取出来,用完后再放回去。 注意 ÿ…...
字节码指令
目录 2.1 入门 2.2 javap 工具 2.3 图解方法执行流程 1)原始 java 代码 2)编译后的字节码文件 3)常量池载入运行时常量池 4)方法字节码载入方法区 5)main 线程开始运行,分配栈帧内存 6)…...
TLS/SSL证书彻底扫盲
证书格式 pem Privacy Enhanced Mail文本格式,以 -----BEGIN CERTIFICATE----- 开头,以-----END CERTIFICATE-----结尾 der 二进制格式,只保存证书,不保存私钥java和window服务器常见 pfx/p12 Predecessor of PKCS#12二进制格式&…...
WGCNA | 值得你深入学习的生信分析方法!~(网状分析-第五步-高级可视化)
1写在前面 前面我们用WGCNA分析完成了一系列的分析,聚类分割模块。🥰 随后进一步筛选,找到与我们感兴趣的表型或者临床特征相关的模块,而且进行了模块内部分析。😘 再然后是对感兴趣模块进行功能注释,了解模…...
try catch finally执行顺序
try catch finally,try里有return,finally还执行么?答案: 执行,并且返回return时,finally的执行早于try。try-catch-finally的执行顺序无return当try中的t()没有抛出异常public static void main(String[] …...
2023年数学建模美赛D题(Prioritizing the UN Sustainability Goals)分析与编程
2023年数学建模美赛D题分析建模与编程 重要说明: 本文介绍2023年美赛题目,并进行简单分析;本文首先对 D题进行深入分析,其它题目分析详见专题讨论;本文及专题分析将在 2月17日每3小时更新一次,完全免费&am…...
35岁测试工程师被辞退,给你们一个忠告
一:前言:人生的十字路口静坐反思 入软件测试这一行至今已经10年多,承蒙领导们的照顾与重用,同事的支持与信任,我的职业发展算是相对较好,从入行到各类测试技术岗位,再到测试总监,再转…...
华为OD机试题 - 租车骑绿岛(JavaScript)
最近更新的博客 2023新华为OD机试题 - 斗地主(JavaScript)2023新华为OD机试题 - 箱子之形摆放(JavaScript)2023新华为OD机试题 - 考古学家(JavaScript)2023新华为OD机试题 - 相同数字的积木游戏 1(JavaScript)2023新华为OD机试题 - 最多等和不相交连续子序列(JavaScri…...
Linux下Python脚本的编写解析fio(minimal格式)(三)
在服务器测试(storage)过程中,会看到很多人写跑fio的脚本用minimal格式来解析,因为这种格式返回的结果对与脚本(shell,python)解析log非常方便.下面介绍一下这种方式下,用Python来解析log 1 一般客户会要求结果中出现一下参数的值: bandwidth…...
Windows Cleaner智能清理引擎:全方位提速系统的开源解决方案
Windows Cleaner智能清理引擎:全方位提速系统的开源解决方案 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 在数字化办公环境中,系统优化…...
intv_ai_mk11 GPU高效利用:支持FP16+CPU offload混合推理,显存不足时自动降级
intv_ai_mk11 GPU高效利用:支持FP16CPU offload混合推理,显存不足时自动降级 1. 什么是intv_ai_mk11 AI对话机器人 intv_ai_mk11是一款基于7B参数Llama架构的AI对话助手,专门设计用于在GPU服务器上高效运行。这个智能对话系统不仅能回答各类…...
Qwen3.5-9B-AWQ-4bit镜像免配置教程:无需conda/pip,7860端口直连使用
Qwen3.5-9B-AWQ-4bit镜像免配置教程:无需conda/pip,7860端口直连使用 1. 开箱即用的视觉理解模型 今天要介绍的是一个能"看懂"图片的AI模型——Qwen3.5-9B-AWQ-4bit。这个模型最厉害的地方在于,它不仅能理解文字,还能…...
忍者像素绘卷微信小程序云开发实践:Serverless生成服务架构
忍者像素绘卷微信小程序云开发实践:Serverless生成服务架构 1. 项目背景与核心价值 忍者像素绘卷是一款基于微信小程序平台的云端图像生成工具,采用Serverless架构实现。它将传统漫画创作与AI技术相结合,为用户提供简单高效的像素艺术创作体…...
STM32duino GNSS库深度解析:Teseo LIV3F驱动与NMEA协议实现
1. 项目概述STM32duino X-NUCLEO-GNSS1A1 是一款面向 STM32 平台的 Arduino 兼容库,专为意法半导体(STMicroelectronics)推出的 X-NUCLEO-GNSS1A1 GNSS 扩展板设计。该扩展板基于意法半导体自研的 Teseo LIV3F 单芯片 GNSS 接收器,…...
OpenClaw+千问3.5-35B-A3B-FP8:法律文书审查辅助工具
OpenClaw千问3.5-35B-A3B-FP8:法律文书审查辅助工具 1. 为什么需要AI辅助法律文书审查 去年接手一个并购项目时,我连续72小时审阅了137份合同文件。在最后一份文件上签字时,手指已经不受控制地颤抖——这不是夸张的文学描写,而是…...
【数据结构与算法】树,森林,二叉树之间的转换
树的定义(递归定义)树是满足以下条件的结构:有且仅有一个根节点(没有父节点的节点)其他节点分成 m 个互不相交的子树每个子树本身也是一棵树树的基本术语术语解释例子根节点最顶层的节点,没有父节点文件夹系…...
程序员副业指南:从技术到变现全攻略
CSDN程序员副业图谱技术文章大纲副业图谱概述副业图谱的定义与背景CSDN平台在程序员副业中的作用副业图谱的核心价值(技能变现、职业发展等)常见程序员副业类型技术博客与内容创作(如CSDN专栏、公众号)在线教育与课程开发…...
Linux下C/C++高效调试工具与技巧全解析
1. Linux终端下C/C调试工具演进史作为一名长期在Linux环境下开发C/C程序的老兵,我深刻理解调试工作对开发效率的影响。很多人对GDB的印象还停留在原始的命令行界面,实际上经过多年发展,终端下的调试工具已经形成了完整的生态体系。从最基础的…...
OpenClaw技能开发入门:为Phi-3-mini-128k-instruct定制自动化插件
OpenClaw技能开发入门:为Phi-3-mini-128k-instruct定制自动化插件 1. 为什么需要自定义OpenClaw技能 去年夏天,我发现自己每天要重复做三件事:查看天气、整理会议纪要、归档下载的文件。这些琐事看似简单,但累积起来每天要消耗我…...






