【JavaEE初阶 — 多线程】Thread的常见构造方法&属性


目录
Thread类的属性
1.Thread 的常见构造方法
2.Thread 的几个常见属性
2.1 前台线程与后台线程
2.2 setDaemon()
2.3 isAlive()
Thread类的属性
- Thread 类是JVM 用来管理线程的一个类,换句话说,每个线程都有一个唯一的Thread 对象与之关联;
- 每个执行流,也需要有一个对象来描述;
- Thread类的对象就是用来描述一个线程执行流的,JVM会将这些Thread对象组织起来,用于线程调度,线程管理。

1.Thread 的常见构造方法
| 方法 | 说明 |
| Thread() | 创建线程对象,必须要重写 Thread类 的 run()方法 |
| Thread(Runnable target) | 使用 Runnable 对象创建线程对象 【不用重写 Thread类 的 run()方法】 |
| Thread(String name) | 创建线程对象,并命名 |
| Thread(Runnable target,String name) | 使用 Runnable对象创建线程对象,并命名 |
| Thread(ThreadGroup group, Runnable target) | 线程可以被用来分组管理,分好的组即为线程组 【这个目前我们了解即可】 |
对于 Thread类 的第四种构造方法,第一个参数传的是lamda表达式,lamda相当于Rannable;
再传入的第二个参数,就是这个线程的名字,需要手动添加 “ ”

如果要调用:带有 自定义线程名字 的参数 的 构造方法,无论自定义的名字是什么,都不会不影响线程的执行的;为了方便程序员调试,可以给线程起名字。

程序运行后,我们可以通过 jconsole 这个工具,在线程列表中,看到自定义名字,并且正在运行的线程。除了自定义的线程,线程列表中的线程是JVM提供的线程。

如果我们不定义名字,程序调用 Thread类 的第一个构造方法,在jconsole的线程列表中,我们可以发现,如果不自定义线程名,系统会使用默认线程名 Thread - 数字 来命名线程。
如果在一个进程中有多个线程,这些线程,会被CPU随机调度,并发执行;
所以不一定会因为主线程结束,整个进程也跟着结束。
2.Thread 的几个常见属性
| 属性 | 获取方法 |
| ID 【线程的唯一标识,不同线程不会重复】 | getId() |
| 名称 【各种调试工具都会用到】 | getName() |
| 状态 【表示线程当前所处的一个情况】 | getState() |
| 优先级 【优先级高的线程理论上来说更容易被调度到】 | getPriority() |
| 是否后台线程 【JVM会在一个进程的所有非后台线程结束后,才会结束运行】 | isDaemon() |
| 是否存活 【简单的理解为,run() 是否运行结束了】 | isAlive() |
| 是否被中断 | isInterrupted() |
2.1 前台线程与后台线程

如果在程序运行的过程中,我们通过 jconsole 查看线程列表中没有main,说明主线程已经结束;
主线程结束,但是 t1,t2,t3 还在,使用进程还在;说明 t1,t2,t3 能够影响进程是否终止。
所有类似 t1,t2,t3 这样能够有效进程存在的线程,称为 “前台线程”。
程序员通过代码创建的线程 和 主线程,都默认是前台线程。

总结:
- 能影响进程存在的,是前台线程;不能影响进程存在的,是后台线程;
- JVM会在一个进程的所有非后台线程结束后,才会结束运行
2.2 setDaemon()
程序员通过编写代码,创建的线程,包括main主线程,默认都是前台线程;
但是可以通过setDaemon(),将 前台线程 修改成 后台线程~~

上述代码的逻辑:主线程和 t 线程并发执行,并且主线程在打印三次“ hello main ”后,打印结束日志,而 t 线程继续执行死循环,所以进程没有因为主线程终止而结束。
所以,t 线程是一个前台线程,我们可以通过 isDeamon() 将 t 设置成后台线程;

通过 t.isDaemon(true) ,把 t 线程 从前台线程设置成后台线程;
此时,代码中只有主线程一个前台线程,所以在主线程运行结束后,整个进程结束,t 线程的死循环也被迫结束。

拓展:
进程与进程之间存在父子关系,而线程与线程之间则不存在;比如:
IDEA 本身也是一个 Java 进程;在 IDEA 中运行一个 Java 代码,通过IDEA 进程,又创建出一个新的Java 进程,这俩进程之间就是父子关系。
2.3 isAlive()
Java 代码中创建的Thread对象,和系统中的线程,是一 一对应的关系;
但是,Thread 对象 的生命周期,和 系统中的线程 的生命周期,是不同的~~
(可能存在:Thread对象 还存活,但是 系统中的线程 已经销毁 的情况)
我们引入一段代码,来看看"Thread对象还存活,但是系统中的线程已经销毁的情况"这种情况:

这个代码的逻辑:
前三秒 sleep1000毫秒 t线程的状态都是alive的状态,三秒后执行结束,t线程的isalive状态为false

线程的入口方法里的逻辑结束了,系统中对应的线程也就随之销毁了(操作系统) ;
虽然系统中的线程已经销毁,但是 Thread对象 还存活;
因此,t线程 被销毁,但是 t 这个对象依旧存在,所以才能一直通过t对象,调用isAlive方法
再多执行几次上述代码,发现程序运行结果中的 true 的个数是 3 还是 4 不固定,这是线程随机调度造成的:

主线程第四次打印,和 t线程 的结束,谁先谁后,是不一定的;
如果打印 true 的次数为4,说明在 第四次 主线程 和 t线程 并发执行的顺序是:
- 先执行主线程中的打印 t.isAlive
- 然后才执行 t线程 中的循环判断是否结束
所以 打印的第一个 false 是第五次执行线程,此时 t 线程已经凉透了~~

相关文章:
【JavaEE初阶 — 多线程】Thread的常见构造方法&属性
目录 Thread类的属性 1.Thread 的常见构造方法 2.Thread 的几个常见属性 2.1 前台线程与后台线程 2.2 setDaemon() 2.3 isAlive() Thread类的属性 Thread 类是JVM 用来管理线程的一个类,换句话说,每个线程都有一个唯一的Thread 对象与之关联&am…...
ctfshow(316)--XSS漏洞--反射性XSS
Web316 进入界面: 审计 显示是关于反射性XSS的题目。 思路 首先想到利用XSS平台解题,看其他师傅的wp提示flag是在cookie中。 当前页面的cookie是flagyou%20are%20not%20admin%20no%20flag。 但是这里我使用XSS平台,显示的cookie还是这样…...
ubuntu22.04安装conda
在 Ubuntu 22.04 上安装 Conda 可以通过以下步骤进行: 下载 Miniconda(轻量级版本的 Conda): 打开终端并运行以下命令以下载 Miniconda 安装脚本: wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-…...
D58【python 接口自动化学习】- python基础之异常
day58 异常捕获 学习日期:20241104 学习目标:异常 -- 74 自定义异常捕获:如何定义业务异常? 学习笔记: 自定义异常的用途 自定义异常的方法 # 抛出一个异常 # raise ValueError(value is error) # ValueError: val…...
Java项目实战II基于Spring Boot的便利店信息管理系统(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在快节奏的…...
Java-日期计算工具类DateCalculator
DateCalculator是用于日期计算的工具类。这个工具类将包括日期的加减、比较、周期计算、日期 范围生成等功能。 import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.Period; import java.time.temporal.ChronoUnit;…...
单片机串口接收状态机STM32
单片机串口接收状态机stm32 前言 项目的芯片stm32转国产,国产芯片的串口DMA接收功能测试不通过,所以要由原本很容易配置的串口空闲中断触发DMA接收数据的方式转为串口逐字节接收的状态机接收数据 两种方式各有优劣,不过我的芯片已经主频跑…...
ipv6的 fc00(FC00::/7) 和 fec0(FEC0::/10)
ipv6的 fc00(FC00::/7)(唯一本地地址) 替代了 fec0(FEC0::/10) (站点本地地址,已弃用) ipv6的 fc00(FC00::/7) 替代了 fec0(FEC0::/10) , 在IPv6地址中,FC00::/7(通常简写为FC00)和…...
Chat GPT英文学术写作指令
目录 Chat GPT英文学术写作指令 Chat GPT英文学术写作指令 1."为我捉供一些建议和技巧,以提高我的学术写作质最和风格" (Provide me with some suggestions andtips to improve the quality andstyleofmyacademic writing.) 2."帮我提写一个清晰而有逻辑的…...
超详细Pycharm安装汉化教程,Python环境配置和使用指南,Python零基础入门看这个就够了!
包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】! PyCharm 是由 JetBrains 打造的一款 Python IDE (集成开发环境,Integrated Development Environment),带有一整套可以帮助用户在使用 Py…...
react-native:解决使用webView后部分场景在安卓10崩溃闪退问题
app闪退问题原因: 安卓7以上版本(7和7以下版本不会出现闪退):在屏幕不可视区域加载webView或者webView不在可视区域内切换页面时app崩溃闪退(在屏幕可视区域加载webView或者webView在可视区域内切换页面不会闪退&…...
大数据工具 flume 的安装配置与使用 (详细版)
参考网址:Flume 1.9用户手册中文版 — 可能是目前翻译最完整的版本了 1,上传安装包 安装包链接:文件下载-奶牛快传 Download |CowTransfer 口令:x8bhcg 1,切换盘符到安装目录 cd /opt/moudles 解压文件…...
智慧城市智慧城市项目方案-大数据平台建设技术方案(原件Word)
第1章 总体说明 1.1 建设背景 1.2 建设目标 1.3 项目建设主要内容 1.4 设计原则 第2章 对项目的理解 2.1 现状分析 2.2 业务需求分析 2.3 功能需求分析 第3章 大数据平台建设方案 3.1 大数据平台总体设计 3.2 大数据平台功能设计 3.3 平台应用 第4章 政策标准保障…...
C语言比较两个字符串是否相同
在不使用string.h中的内置函数的情况下 #include <stdio.h> #include <string.h> void main(){char arr1[]"hello world";char arr2[]"hello world";int i,a0;if(strlen(arr1)!strlen(arr2)){print("不相等");return 0;}for(i0;arr…...
丹摩征文活动|FLUX.1图像生成模型:AI工程师的创新实践
文章目录 一、对"FLUX.1"系列模型版本分析 二、AI工程师与FLUX.1系列模型 三、ComfyUI在线部署四、FLUX.1在线部署五、添加工作流呈现效果图展示六、总结 黑森林实验室(Black Forest Labs)推出的FLUX.1图像生成模型,凭借120亿参数的…...
ZABBIX API获取监控服务器OS层信息
Zabbix 是一款强大的开源监控解决方案,能够通过其 API 接口自动化管理和获取监控数据。在这篇文章中,详细讲解如何通过 Zabbix API 批量获取服务器的系统名称、IP 地址及操作系统版本信息,并将数据保存到 CSV 文件中。本文适合对 Python 编程和 Zabbix 监控系统有一定基础的…...
SpringBoot基础系列学习(五):JdbcTemplate 访问数据库
文章目录 一丶介绍二丶引入依赖三丶配置配置文件四丶创建表五丶java代码 一丶介绍 Spring Boot作为Spring的集大成者,自然会将JdbcTemplate集成进去。Spring Boot针对JDBC的使用提供了对应的Starter包:spring-boot-starter-jdbc,它其实就是在…...
JavaEE-多线程初阶(3)
目录 1.线程的状态 1.1 NEW、RUNNABLE、TERMINATED 1.2 TIMED_WAITING 1.3 WAITING 1.4 BLOCKED 2.多线程带来的风险-线程安全(重点) 2.1 观察线程不安全的现象 2.2 分析产生该现象的原因 2.3 产生线程安全问题的原因 2.3.1 抢占式执行&#x…...
从入门到精通:如何在Vue项目中有效运用el-image-viewer
Element UI之el-image-viewer组件详解 引言 在现代 Web 应用中,高质量的用户体验是不可或缺的一环。Element UI 作为一款基于Vue.js 2.0 的桌面端组件库,以其丰富的组件集、良好的文档和支持赢得了广大开发者的好评。本文将深入探讨el-image-viewer组件,这是一个用于在网页…...
uniapp组件实现省市区三级联动选择
1.导入插件 先将uni-data-picker组件导入我们的HBuilder项目中,在DCloud插件市场搜索uni-data-picker 点击下载插件并导入到我们的项目中 2.组件调用 curLocation :获取到的当前位置(省市区) <uni-data-picker v-slot:defa…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
leetcode73-矩阵置零
leetcode 73 思路 记录 0 元素的位置:遍历整个矩阵,找出所有值为 0 的元素,并将它们的坐标记录在数组zeroPosition中置零操作:遍历记录的所有 0 元素位置,将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...


