第2章 深入理解Thread构造函数
Thread的构造函数。
![![[Pasted image 20241206152027.png]]](https://i-blog.csdnimg.cn/direct/3eee95bfc662463da7dd5a95f8076b36.png)
2.1 线程的命名
在构造一个Thread时可以为其命名。
2.1.1 线程的默认命名
下面构造函数中,并没有为线程命名。
Thread()
Thread(Runnable target)
Thread(ThreadGroup group, Runnable target)
打开源码会看到
public Thread(Runnable target) { this(null, target, "Thread-" + nextThreadNum(), 0);
}private static int threadInitNumber; private static synchronized int nextThreadNum() { return threadInitNumber++;
}
故对于没有命名的线程的名字会以"Thread-"开头,后面的数字依次递增。
public static void defaultName() { Runnable runnable = () -> System.out.println(Thread.currentThread().getName()); // 将会创建三个线程并调用其start方法 IntStream.rangeClosed(1, 3).boxed().map(x -> runnable).map(Thread::new).forEach(Thread::start);
}
输出 :
Thread-1
Thread-0
Thread-2
2.1.2 命名线程
下面的构造方法可以在创建一个Thread时为其命名。
Thread(String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
Thread(ThreadGroup group, Runnable target, String name, long stackSize,
boolean inheritThreadLocals)
Thread(ThreadGroup group, String name)
public static Runnable runnable = () -> System.out.println(Thread.currentThread().getName());
public static List<String> list = Arrays.asList("anan", "jcjc", "yryr", "mymy");public static void assignName() { IntStream.rangeClosed(0, 3).boxed().map(list::get).map(threadName -> new Thread(runnable, threadName)).forEach(Thread::start);
}
输出 :
anan
jcjc
yryr
mymy
2.1.3 修改线程的名字
在线程启动之前,你可以更改线程的名字,但调用之后就不能更改了。
这是setName的源码
public final synchronized void setName(String name) { checkAccess(); if (name == null) { throw new NullPointerException("name cannot be null"); } this.name = name; if (threadStatus != 0) { // 线程不是NEW状态对其的修改不会生效 setNativeName(name); }
}
2.2 线程的父子关系
- 一个线程的创建肯定是由另一个线程完成的
- 被创建的线程的父线程就是创建这个线程的线程。
例如在main线程中创建了一个线程x,那么x的父线程就是main线程
2.3 Thread与ThreadGroup
在线程的构造函数可以显式地指定线程的Group,也就是ThreadGroup。
如果在构造一个线程时没有指定它的Group,那么会加入到父线程的Group。
public static Runnable runnable2 = () -> System.out.println(Thread.currentThread().getThreadGroup().getName());
public static void defaultThreadGroup() { // 创建一个线程 Thread thread = new Thread(runnable2, "mymy"); ThreadGroup group = new ThreadGroup("yjyj"); Thread thread1 = new Thread(group, runnable2, "jcjc"); thread.start(); thread1.start();
}
输出 :
main
yjyj
2.4 Thread和Runnable
Thread负责线程本身相关的职责和控制,而Runnable则负责逻辑执行单元的部分。
2.5 Thread与JVM虚拟机栈
。。。 这段太抽象了
2.5.1 Thread与Stacksize
2.5.2 JVM内存结构
JVM在执行Java程序的时候会把对应的物理内存划分成不同的内存区域,每一个区域都存放着不同数据,也有不同的创建与销毁时机,有些分区会在JVM启动时就创建,有些则是在运行时才创建。
![![[Pasted image 20241206162347.png]]](https://i-blog.csdnimg.cn/direct/62cc12f2a2d44d06ad63d2c051445e28.png)
- 程序计数器
程序计数器在JVM中所起的作用就是用于存放当前线程接下来将要执行的字节码指令、分支、循环、跳转、异常处理等信息。 - Java虚拟机栈
Java虚拟机栈也是线程私有的,它的生命周期与线程相同,是在JVM运行时所创建的,在线程中,方法在执行的时候都会创建一个名为栈帧(stack frame)的数据结构,主要用于存放局部变量表、操作栈、动态链接、方法出口等信息。
![![[Pasted image 20241206162917.png]]](https://i-blog.csdnimg.cn/direct/2d21232284ac4662883349cd2b1c920c.png)
方法的调用是栈帧被压入和弹出的过程。同等的虚拟机栈如果局部变量表等占用内存
越小则可被压入的栈帧就会越多,反之则可被压入的栈帧就会越少,一般将栈帧内存的大小称为宽度,而栈帧的数量则称为虚拟机栈的深度。
- 本地方法栈
Java中提供了调用本地方法的接口(Java NativeInterface),也就是C/C++程序,在线程的执行过程
中,经常会碰到调用JNI方法的情况,比如网络通信、文件操作的底层,甚至是String的intern等都是JNI方法,JVM为本地方法所划分的内存区域便是本地方法栈,这块内存区域其自由度非常高,完全靠不同的JVM厂商来实现,Java虚拟机规范并未给出强制的规定,同样它也是线程私有的内存区域。 - 堆内存
堆内存是JVM中最大的一块内存区域,被所有的线程所共享,Java在运行期间创建的所有对象几乎都存放在该内存区域,该内存区域也是垃圾回收器重点照顾的区域,因此有些时候堆内存被称为“GC堆”。 - 方法区
方法区也是被多个线程所共享的内存区域,他主要用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器(JIT)编译后的代码等数据。
2.5.3 Thread与虚拟机栈
2.6 守护线程
守护线程是一类比较特殊的线程,一般用于处理一些后台的工作。
2.6.1 什么是守护线程
public static Runnable runnable3 = () -> { while (true) { System.out.println("haha"); sleep(1); }
};public static void deamonThread() { System.out.println(Thread.currentThread().getName()); Thread thread = new Thread(runnable3); thread.setDaemon(true); // 将其设置为守护线程 thread.start(); // 启动线程
}
main线程
deamonThread();
sleep(1);
输出 :
main
haha
haha
当main线程退出后,守护线程也随之自动关闭了。
如果父线程为守护线程那么子线程也为守护线程。
2.6.2 守护线程的作用
守护线程经常用作与执行一些后台任务,因此有时它也被称为后台线程,当你希望关闭某些线程的时候,或者退出JVM进程的时候,一些线程能够自动关闭,此时就可以考虑用守护线程为你完成这样的工作。
2.7 本章总结
相关文章:
第2章 深入理解Thread构造函数
Thread的构造函数。 2.1 线程的命名 在构造一个Thread时可以为其命名。 2.1.1 线程的默认命名 下面构造函数中,并没有为线程命名。 Thread() Thread(Runnable target) Thread(ThreadGroup group, Runnable target)打开源码会看到 public Thread(Runnable targe…...
PLC扫描周期和工作原理
可编程逻辑控制器(PLC)的运行原理和扫描周期是其实现工业自动化的核心机制。以下从运行原理、扫描周期组成、关键特性及优化方向等方面进行详细阐述: 一、PLC运行原理 PLC采用**循环扫描(Cyclic Scan)**的工作模式&am…...
玩转Docker | 使用Docker部署本地自托管reference速查表工具
玩转Docker | 使用Docker部署本地自托管reference速查表工具 前言一、Reference介绍Reference简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署reference服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问reference应用五、测试与…...
MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 2
第02章_MySQL的数据目录 1. MySQL8的主要目录结构 1.1 数据库文件的存放路径 MySQL数据库文件的存放路径:/var/lib/mysql/ MySQL服务器程序在启动时会到文件系统的某个目录下加载一些文件,之后在运行过程中产生的数据也都会存储到这个目录下的某些文件…...
跟着 Lua 5.1 官方参考文档学习 Lua (3)
文章目录 2.5 – Expressions2.5.1 – Arithmetic Operators2.5.2 – Relational Operators2.5.3 – Logical Operators2.5.4 – Concatenation2.5.5 – The Length Operator2.5.6 – Precedence2.5.7 – Table Constructors2.5.8 – Function Calls2.5.9 – Function Definiti…...
ORM框架详解:为什么不直接写SQL?
想象一下,你正在开发一个小型的在线书店应用。你需要存储书籍信息、用户数据和订单记录。作为一个初学者,你可能会想:“我已经学会了SQL,为什么还要使用ORM框架呢?直接写SQL语句不是更简单、更直接吗?” 如…...
【Server Components 解析:Next.js 的未来组件模型】
🛠️ Server Components 解析:Next.js 的未来组件模型 本文将用 3000 字 ,带你彻底掌握 React Server Components 的核心原理与实战技巧。无论你是刚接触 Next.js 的新手,还是想优化现有项目的老手,这里都有你需要的关…...
2025最新智能优化算法:改进型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23个经典函数测试集,MATLAB
一、改进型雪雁算法 雪雁算法(Snow Geese Algorithm,SGA)是2024年提出的一种新型元启发式算法,其灵感来源于雪雁的迁徙行为,特别是它们在迁徙过程中形成的独特“人字形”和“直线”飞行模式。该算法通过模拟雪雁的飞行…...
基于spring boot物流管理系统设计与实现(代码+数据库+LW)
摘 要 社会发展日新月异,用计算机应用实现数据管理功能已经算是很完善的了,但是随着移动互联网的到来,处理信息不再受制于地理位置的限制,处理信息及时高效,备受人们的喜爱。本次开发一套物流管理系统有管理员和用户…...
HTTP 和RESTful API 基础,答疑
一文搞懂RESTful API - bigsai - 博客园 1. API 路径 开头必须 /,表示绝对路径,不支持 . 或 ..(相对路径)。API 结尾 / 通常不需要,但部分框架会自动处理 / → 无 /。 ✅ 推荐 GET /api/v1/products # 资源集合…...
【数据挖掘】深度挖掘
【数据挖掘】深度挖掘 目录:1. 减少样本集的数量知识点示例 2. 对噪声比集剪枝知识点示例建立局部树代码示例(使用 Python 和 scikit - learn 库构建局部决策树)代码解释注意事项 最大超平面定义原理求解方法代码示例(使用 Python…...
OpenGL(2)基于Qt做OpenGL开发
文章目录 一、基于Qt做OpenGL开发1、环境准备2、创建OpenGL窗口3、绘制基本图形 一、基于Qt做OpenGL开发 1、环境准备 确保你已经安装了 Qt 开发环境(包含 Qt Creator),并且支持 OpenGL 开发。在创建 Qt 项目时,选择 “Qt Widget…...
使用JWT实现微服务鉴权
目录 一、微服务鉴权 1、思路分析 2、系统微服务签发token 3、网关过滤器验证token 4、测试鉴权功能 前言: 随着微服务架构的广泛应用,服务间的鉴权与安全通信成为系统设计的核心挑战之一。传统的集中式会话管理在分布式场景下面临性能瓶颈和扩展性…...
高并发内存池项目介绍
💓博主CSDN主页:Am心若依旧409-CSDN博客💓 ⏩专栏分类:项目记录_⏪ 🚚代码仓库:青酒余成 🚚 🌹关注我🫵带你学习C 🔝🔝 1.前言 在经历一年多左右的时间…...
PHP会务会议系统小程序源码
📅 会务会议系统 一款基于ThinkPHPUniapp框架,精心雕琢的会议管理微信小程序,专为各类高端会议场景量身打造。它犹如一把开启智慧殿堂的金钥匙,为会议流程优化、开支精细化管理、数量精准控制、标准严格设定以及供应商严格筛选等…...
Java中的常用类 --String
学习目标 掌握String常用方法掌握StringBuilder、StringBuffer了解正则 1.String ● String是JDK中提前定义好的类型 其所在的包是java.lang ,String翻译过来表示字符串类型,也就是说String类中已经提前定义好了很多方法都是用来处理字符串的,所以Str…...
PWM(脉宽调制)技术详解:从基础到应用实践示例
PWM(脉宽调制)技术详解:从基础到应用实践示例 目录 PWM(脉宽调制)技术详解:从基础到应用实践示例学前思考:一、PWM概述二、PWM的基本原理三、PWM的应用场景四、PWM的硬件配置与使用五、PWM的编程…...
Hutool - DB 连接池配置集成
在实际开发中,尤其是在高并发场景下,使用连接池来管理数据库连接是非常必要的,它可以显著提高数据库操作的性能和效率。Hutool - DB 支持集成多种常见的连接池,如 HikariCP、Druid 等。下面分别介绍如何将这两种连接池集成到 Huto…...
激光工控机在自动化生产线中有什么关键作用?
激光工控机作为自动化生产线的核心设备,通过高精度控制、快速响应和智能化集成,在提升效率、保障质量、实现柔性制造等方面发挥着不可替代的作用。以下是其关键作用的具体分析: 一、实现高效连续生产: 1.高速加工能力࿱…...
Visual Studio Code的下载安装与汉化
1.下载安装 Visual Studio Code的下载安装十分简单,在本电脑的应用商店直接下载安装----注意这是社区版-----一般社区版就足够用了---另外注意更改安装地址 2.下载插件 重启后就是中文版本了...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
