多线程 02
1.线程的常见构造方法
| 方法 | 说明 |
| Thread() | 创建线程对象 |
| Thread(Runnable target) | 使用 Runnable 对象创建线程对象 |
| Thread(String name) | 创建线程对象,并命名 |
| Thread(Runnable target, String name) | 使用 Runnable 对象创建线程对象,并命名 |
| 【了解】Thread(ThreadGroup group, Runnable target) | 线程可以被用来分组管理,分好的组即为线程组,这 个目前我们了解即可 |
2.线程的几个属性和方法
| 属性 | 获取方法 |
| ID | getId() |
| 名称 | getName() |
| 状态 | getState() |
| 优先级 | getPriority() |
| 是否后台线程 | isDaemon() |
| 是否存活 | isAlive() |
| 是否被中断 | isInterrupted() |
这里的后台线程和前台线程不同,当所有的前台线程执行完毕,即使后台线程还在工作中,也会直接自动退出.
只要前台线程没执行完,进程就不会结束,即使main结束了,前台线程也会继续执行
设置为后台进程
setDaemon()设为true就是后台,不设置就是默认前台
isAlive()表示内核中的PCB是否存在
这个对象的生命周期和PCB的是不完全一样的
因为我在创建对象之后这个PCB才存在,在执行完进程结束后之后这个PCB才销毁,而且java中的用户级线程不是直接映射到操作系统中的原生线程的
3.创建线程的5个方式
其实线程是操作系统提供的一种机制,并给用户提供了一些api供使用,Java的Thread类只是对其的进一步封装.
1.继承Thread类,重写run方法
2.重写runnable接口
3.使用匿名内部类实现Thread
4.使用匿名内部类实现Runnable接口
5.使用Lambda表达式
4.start()和run()方法的区别
说实话这两个方法是八竿子打不着的,为什么要把他们两个放进来比较呢?
可能有人认为start方法和run方法执行的是一件事情
其实这个理解是大错特错的,这两个方法完全不一样,我们举个例子
假设我们在调用main方法中调用一个run方法,你可能以为这样和使用start方法是一样的,其实不然,我们在run方法中是一个死循环,在main方法中调用run方法,下面再写一个死循环,此时控制台只会打印线程中的死循环的内容而不会打印main方法中的内容
而start方法实际上创建了一个新的线程,根据cpu的随机调度(抢占式调度),两者都可能打印出来,下面我给出代码支持.
package Test;import java.awt.desktop.ScreenSleepEvent;public class ThreadDemo2 {public static void main(String[] args) {Thread t = new Thread(()->{while (true){System.out.println("hello Thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.run();while (true){System.out.println("Hello main");}} }
package Test;import java.awt.desktop.ScreenSleepEvent;public class ThreadDemo2 {public static void main(String[] args) throws InterruptedException {Thread t = new Thread(()->{while (true){System.out.println("hello Thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();while (true){System.out.println("Hello main");Thread.sleep(1000);}} }
5.终止一个线程
package Thread;public class ThreadDemo12 {private static boolean isQuit = false;public static void main(String[] args) throws InterruptedException {Thread t = new Thread(()->{while(!isQuit){System.out.println("我是一个线程,工作中");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println("线程工作完毕");});t.start();Thread.sleep(3000);isQuit = true;System.out.println("让t线程退出");} }最后结果为
这就好比这个时候我在打游戏,女朋友突然叫我去和她一起开心一下,这个时候就是main线程来中断我这个t线程,我得配合她她才能中断我的动作,假设我不配合,那她也没有办法.
所以这里的线程运行中想要中断,其实是需要两个线程中相互配合的,这里就使用了isQuit变量来实现其中的相互配合.
.
其实这里也有一个方法来实现对线程的中断,我们来尝试一下
interrupt()
isInterrupted() 判断是否被打断
我们不妨来试试用这个来作为标志位
package Thread;public class ThreadDemo13 {public static void main(String[] args) {Thread t = new Thread(()->{while(!Thread.currentThread().isInterrupted()) {System.out.println("我是一个线程,正在工作");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("线程执行完毕");});t.start();try {Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("t线程退出");t.interrupt();} }结果是
我们发现t线程并没有真正的执行结束,并且捕获了一个打断异常
结论:
sleep中的线程被打断之后,线程并没有直接退出,而是继续一直输出信息
这是因为线程在睡眠中被打断会抛出一个异常,并将isInterrupted重新设置为false
解决方案,在收到这个打断的异常之后,直接break跳出循环
有人会觉得还不如之前的isQuit标志位好,想在遇到这个异常信息的时候将isQuit设置为true,其实是行不通的,可以参考我上一篇文章中的变量捕获.因为匿名内部类中调用的局部变量只能是final修饰的或是事实final的
6.线程中的join方法
join方法能够实现线程的等待,假如在main线程中调用t.join,此时main线程就会等待t线程执行结束后再继续工作,t线程执行的时候,此线程属于阻塞状态
下面举个例子说明一下
package Thread;public class ThreadDemo14 {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(()->{for (int i = 0; i < 5; i++) {System.out.println("马上到...");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println("终于到了!!!");});t1.start();t1.join();System.out.println("我等你好久了~~~");}}执行结果如下
注:start方法一定在join方法之前调用
此时main线程等待了t1线程执行完了才开始执行
相关文章:
多线程 02
1.线程的常见构造方法 方法说明Thread()创建线程对象Thread(Runnable target)使用 Runnable 对象创建线程对象Thread(String name)创建线程对象,并命名Thread(Runnable target, String name)使用 Runnable 对象创建线程对象,并命名【了解】Thread(Threa…...
车辆管控大数据可视化平台案例源码分析【可视化项目案例-10】
🎉🎊🎉 你的技术旅程将在这里启航! 🚀🚀 本专栏包括但不限于大屏可视化、图表可视化等等。订阅专栏用户在文章底部可下载对应案例源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不论你是初学者还是资深开发者,这里都有适合你的内容。…...
链表的回文结构
题目描述 题目链接:链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 题目分析 我们的思路是: 找到中间结点逆置后半段比对 我们可以简单画个图来表示一下: ‘ 奇数和偶数都是可以的 找中间结点 我们可以用快慢指针来找中:l…...
CSS特效017:球体涨水的效果
CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花边是描述了一些CSS…...
Windows下安装Anaconda3并使用JupyterNoteBook
下载安装包 Anaconda官网 进官网,点击下载 自动根据当前系统下载对应的包了,安装包大约1G,喝杯Java耐心等待。 安装 很多人安装C盘,我这里放D盘。 注意:你的文件夹目录一定要不能有空格 然后其他的直接默认install即…...
什么年代了,还不会 CI/CD 么?
目录 什么是 CI/CD? CI/CD 对业务有哪些好处? 一:确保卓越的代码质量 二:更快的发布速度 → 更快的交付 三:自动化降低成本 四:故障隔离 五:简化回滚 六:持续反馈 七&#…...
centos 7.7 安装Python-3.7.4
一、安装PYTHON 编译依赖包 1.1 首先安装gcc编译器,gcc有些系统版本已经默认安装,通过 gcc --version 查看,没安装的先安装gcc, yum -y install gcc glibc make1.2 安装其它依赖包,(注:不要缺…...
git的用法
目录 一、为什么需要git 二、git基本操作 2.1、初始化git仓库 2.2、配置本地仓库的name和email 2.3、认识工作区、暂存区、版本库 三、git的实际操作 3.1 提交文件 3.2 查看git状态以及具体的修改 3.3 git版本回退 git reset 3.1 撤销修改 四、git分支管理 4.…...
管道在Vue和Angular中的作用及React的替代方案
管道在Vue和Angular中的作用及React的替代方案 前言管道起源管道特点 前端中管道概念和作用概念作用 React关于管道的替代方案Vue和Angular管道的区别 前言 本文主要讲解管道在Vue和Angular中有哪些作用以及React对于管道概念的替代方案是什么。 管道起源 计算机中的Pipline…...
计算机基础知识57
前后端数据传输的编码格式(contentType) # 我们只研究post请求方式的编码格式: get请求方式没有编码格式-- index?useranme&password get请求方式没有请求体,参数直接在url地址的后面拼接着 # 有哪些方式可以提交post请求:f…...
Flutter 小技巧之 3.16 升级最坑 M3 默认适配技巧
如果要说 Flutter 3.16 升级里是最坑的是什么?那我肯定要说是 Material 3 default (M3)。 倒不是说 M3 bug 多,也不是 M3 在 3.16 上使用起来多麻烦,因为虽然从 3.16 开始,MaterialApp 里的 useMaterial3 …...
激光雷达与惯导标定 | Lidar_IMU_Init : 编译
激光雷达与惯导标定:Lidar_IMU_Init 编译 功能包安装安装ceres-solver-2.0.0 (注意安装2.2.0不行,必须要安装2.0.0) LI-Init是一种鲁棒、实时的激光雷达惯性系统初始化方法。该方法可校准激光雷达与IMU之间的时间偏移量和外部参数…...
进程池,线程池与跨进程数据共享爬取某岸网图片
看教程的时候看到一个,生产者跟消费者的概念比较有意思,但是给的代码有问题无法正常运行,于是我就捣鼓了一下。 基本概念就是: 生产者: 一个进程获取网页没页的图片连接(主进程…...
【 图片加载】Vue前端各种图片引用
文章目录 一、图片作为js常量(常作为配置项的值 )1、在线链接2、本地图片 二、图片img标签1、一般的src2、动态的src用require3、src可以接收二进制文件blob(如后端返回的、a-upload传的图片) 三、背景图片 一、图片作为js常量(常…...
thinkphp6生成PDF自动换行
composer安装 composer require tecnickcom/tcpdf 示例 use TCPDF;public function info($university,$performance,$grade,$major){//获取到当前域名$domain request()->domain();//实例化$pdf new TCPDF(P, mm, A4, true, UTF-8, false);// 设置文档信息$pdf->SetCr…...
wpf devexpress实现输入验证使用验证规则
打开此项目 目标是一个registration form行为像google registration form。打开Google registration form 研究它的行为。当form是第一次显示,它的“Register”按钮应该启动;编辑器没有提示任何输入错误。输入First Name编辑器字段,清理输入…...
Vue表单的整体处理
在前端的处理中,表单的处理永远是占高比例的。在BOMDOMjs的时候是这样,在Vue的时候也是这样。Vue的表单处理做了特别的优化,如值绑定、数据验证、错误提示、修饰符等。 表单组件的示例: <script setup lang"ts">…...
探索实人认证API:保障在线交互安全的关键一步
前言 在数字化时代,随着人们生活的日益数字化,各种在线服务的普及,安全性成为用户体验的至关重要的一环。特别是在金融、电商、社交等领域,确保用户身份的真实性显得尤为重要。而实人认证API作为一种先进的身份验证技术ÿ…...
XDR 网络安全:技术和最佳实践
扩展检测和响应(XDR)是一种安全方法,它将多种保护工具集成到一个统一的集成解决方案中。它为组织提供了跨网络、端点、云工作负载和用户的广泛可见性,从而实现更快的威胁检测和响应。 XDR的目标是提高威胁检测的速度和准确性&…...
【如何学习Python自动化测试】—— 警告框处理
7 、 警告框处理 在 web 中,除了上面提到的元素和操作之外,还有就是页面的提示框的处理了,页面的警告框通常分为这几类 js:alert 、 confirm 以及 prompt,这些警告框,我们都可以通过 switch_to_alert()来处…...
基于LangGraph与LLM的智能数据分析平台OpenChatBI实战指南
1. 项目概述:当自然语言遇上数据分析作为一名在数据分析和BI工具领域摸爬滚打了十多年的老兵,我见过太多团队在数据民主化道路上的挣扎。业务同学想自己看个数据,得先学SQL语法、搞懂表结构、再琢磨怎么关联,一套流程下来…...
Phi-mini-MoE-instruct轻量级MoE模型快速部署教程:3步完成Ubuntu环境搭建
Phi-mini-MoE-instruct轻量级MoE模型快速部署教程:3步完成Ubuntu环境搭建 1. 开篇:为什么选择Phi-mini-MoE-instruct 如果你正在寻找一个既轻量又强大的语言模型,Phi-mini-MoE-instruct绝对值得一试。这个基于混合专家(MoE)架构的模型&…...
PR曲线绘制超简单
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 PR曲线绘制超简单:从入门到自动化实战指南 目录 PR曲线绘制超简单:从入门到自动化实战指南 引言ÿ…...
正则表达式终极指南:10个文本处理匹配技巧
正则表达式终极指南:10个文本处理匹配技巧 【免费下载链接】interview 📚 C/C 技术面试基础知识总结,包括语言、程序库、数据结构、算法、系统、网络、链接装载库等知识及面试经验、招聘、内推等信息。This repository is a summary of the b…...
终极PHP导航菜单指南:从KnpMenu到Spatie Menu的完整实现方案
终极PHP导航菜单指南:从KnpMenu到Spatie Menu的完整实现方案 【免费下载链接】awesome-php A curated list of amazingly awesome PHP libraries, resources and shiny things. 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-php PHP导航菜单是Web应…...
3步解锁Switch Joy-Con手柄在Windows的完整潜力:JoyCon-Driver实战指南
3步解锁Switch Joy-Con手柄在Windows的完整潜力:JoyCon-Driver实战指南 【免费下载链接】JoyCon-Driver A vJoy feeder for the Nintendo Switch JoyCons and Pro Controller 项目地址: https://gitcode.com/gh_mirrors/jo/JoyCon-Driver 想要让闲置的Switch…...
Arm Neoverse V1 PMU架构与性能监控实战
1. Neoverse V1 PMU架构深度解析1.1 PMUv3p4架构特性Arm Neoverse V1采用的PMUv3p4是Armv8.4-A架构中的性能监控扩展实现。这个版本在基础PMU功能上引入了多项增强特性:扩展事件空间:通过新增的PMMIR_EL1寄存器提供更多微架构事件编码空间,支…...
C++ 常用关键字使用举例
1. static控制作用域、生命周期或类成员归属123456789101112131415// 1. 全局/命名空间:仅当前文件可见(避免跨文件重定义)static int global_static 10; // 其他文件无法通过 extern 访问// 2. 局部变量:生命周期延长至程序结束…...
AI日志分析系统:多代理自修正RAG架构解析与实践
1. 日志分析系统的现状与挑战现代软件系统产生的日志数据正以惊人的速度增长。根据2023年DevOps状态报告,大型互联网公司每天产生的日志量普遍超过1TB,而传统金融系统的日志量也达到了数百GB级别。这些日志包含了系统运行状态、错误信息、性能指标等关键…...
MCP AI推理配置紧急升级通知:CVE-2024-MCP-08已曝,未配置memory_limit_policy的实例存在RCE风险
更多请点击: https://intelliparadigm.com 第一章:MCP AI 推理配置紧急升级通知:CVE-2024-MCP-08已曝,未配置memory_limit_policy的实例存在RCE风险 漏洞核心影响 CVE-2024-MCP-08 是一个高危远程代码执行(RCE&#…...









