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…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
STL 2迭代器
文章目录 1.迭代器2.输入迭代器3.输出迭代器1.插入迭代器 4.前向迭代器5.双向迭代器6.随机访问迭代器7.不同容器返回的迭代器类型1.输入 / 输出迭代器2.前向迭代器3.双向迭代器4.随机访问迭代器5.特殊迭代器适配器6.为什么 unordered_set 只提供前向迭代器? 1.迭代器…...






