当前位置: 首页 > news >正文

Thread 类的基本用法

文章目录

  • 一、线程创建
    • 1.1 Thread的常见构造方法
    • 2.1 创建线程
  • 二、线程中断
    • 2.1 Thread的几个常见属性
    • 2.2 中断线程
  • 三、线程等待
  • 四、线程休眠
  • 五、获取线程实例

一、线程创建

1.1 Thread的常见构造方法

方法说明
Thread()创建线程对象
Thread(Runnable target)使用Runnable对象创建线程对象
Thread(String name)创建线程对象,并命名
Thread(Runnable target,String name)使用Runnable对象创建线程对象,并命名

2.1 创建线程

Thread t1 = new Thread();
Thread t2 = new Thread(new MyRunnable());
Thread t3 = new Thread("这是我的名字");
Thread t4 = new Thread(new MyRunnable(), "这是我的名字");

二、线程中断

2.1 Thread的几个常见属性

属性获取方法
IDgetId()
名称getName()
状态getState()
优先级getPriority()
是否后台线程isDaemon()
是否存活isAlive()
是否被中断isInterrupted()
  • ID是线程的唯一标识,不同线程不会重复
  • 名称是各种调试工具用到
  • 状态表示线程当前所处的一个情况
  • 优先级高的线程理论上来说更容易被调度到
  • 关于后台线程,需要记住一点:JVM会在一个进程的所有非后台线程结束后,才会结束运行
  • 是否存活,即简单的理解,为run方法是否运行结束了

2.2 中断线程

中断线程,就是让一个线程停下来,本质上说,让一个线程终止,只有一个办法,那就是让线程的入口方法,执行完毕!

目前常见的有以下两种方式用以中断线程:

  1. 通过共享的标记来进行沟通
  2. 调用interrupt()方法来通知

第一种:需要自定义一个标志位,并且需要给该标志位加上一个volatile关键字修饰,代码如下:

package threrading;public class ThreadDemo8 {//lambda表达式中访问外部的局部变量遵循 变量捕获语法规则//java中要求变量捕获必须是finall或者没有被修改过的变量public volatile boolean isQuit = false;  //设置标志位 控制循环public static void main(String[] args) {Thread t = new Thread( ()->{while (!isQuit){System.out.println("hello t");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("t 线程结束");});t.start();try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}//在主线程中修改isQuitisQuit=true;}
}

第二种: 使用 Thread.interrupted() 或者 Thread.currentThread().isInterrupted() 代替自定义标志位,代码如下:

package threrading;public class ThreadDemo9 {public static void main(String[] args) {Thread t = new Thread(()->{//currentThread是获取当前线程的实例//此处currentThread 得到的就是t//isInterrupted 就是t对象里自带的一个标志位while (!Thread.currentThread().isInterrupted()){System.out.println("hello t");try {Thread.sleep(1000);} catch (InterruptedException e) {//报异常之后,如果需要结束循环,就需要在这下面手动加一个break;e.printStackTrace();break;}}});t.start(); //代码执行到这里,主线程继续执行,新线程进入run中去执行,两个进程并发执行/*** 如果slepp执行时看到这个标志位是false,sleep正常进行休眠操作* 如果当前标志位是true,* sleep无论是刚刚执行还是已经执行了一半,都会触发两件事:*  1.立即抛出异常*  2.清空标志位为false  (此后,标志位一直为false,因为主线程的t.interrupt();只被执行一次)*/try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}//把t内部的标志位 设置为true//  主线程并非是循环反复设置,而是只执行一次t.interrupt();  //这个执行完,主线程就执行完了/*interrupt的作用:1.设置标志位为true2.如果该线程正在阻塞中(比如在执行sleep)此时就会把阻塞状态唤醒通过抛出异常的方式让sleep立即结束*//*注意:当sleep被唤醒的时候,sleep会自动把isInterrupted标志位自动清空(true-->false)为啥要sleep清空标志位呢?目的就是为了让线程自身能够对于线程何时结束,有一个更明确的控制*/}
}

三、线程等待

线程之间是并发执行的,操作系统对于系统的调度,是无序的,无法判定两个线程谁先执行结束,谁后执行结束!但是在实际开发过程中,有时候我们需要明确规定某一个线程要先执行完,这时候我们就需要调用线程的 join() 方法。

假设在一段代码中有一个线程 t 以及其主线程(main), t 线程启动之后,如果在main线程中调用 t.join() ,意思就是让main线程等待 t 线程先结束,再往下执行!!!

如果是 t1 线程中调用 t2.join() ,就是让 t1 线程等待 t2 线程先结束,此时 t1线程进入阻塞状态,其他线程正常调度。

package threrading;public class ThreadDemo10 {public static void main(String[] args) throws InterruptedException {Thread t = new Thread(()->{System.out.println("hello t");});t.start();t.join();  //在执行时,如果t线程还没有结束,main线程就会 阻塞(Blocking) 等待。如果t已经结束,就不会阻塞,main继续执行。//是在main线程中,调用t.join。意思是让main线程等待t先结束,再往下执行//如果是t1线程中,调用t2.join。就是让t1线程等待t2先结束//t1线程进入阻塞,其他线程正常调度System.out.println("hello main");}
}

四、线程休眠

休眠线程,就是调用Thread.sleep()方法,这里会抛出异常。

但是值得注意的是,由于线程的调度是不可控的,所以这个方法只能保证实际休眠时间大于等于参数设置的休眠时间

五、获取线程实例

获取线程的实例非常的简单,就是调用Thread.currentThread()方法,这个在线程中断部分提及过,下面是简单的代码示例:

public class ThreadDemo {public static void main(String[] args) {Thread thread = Thread.currentThread();System.out.println(thread.getName());}
}

相关文章:

Thread 类的基本用法

文章目录一、线程创建1.1 Thread的常见构造方法2.1 创建线程二、线程中断2.1 Thread的几个常见属性2.2 中断线程三、线程等待四、线程休眠五、获取线程实例一、线程创建 1.1 Thread的常见构造方法 方法说明Thread()创建线程对象Thread(Runnable target)使用Runnable对象创建线…...

2023.3.28 天梯赛训练赛补题(病毒溯源 , 龙龙送外卖 , 红色警报)

文章目录1.病毒溯源问题:求树的最长链长度和字典序最小的最长链思路:2.龙龙送外卖思路:3.红色警报:思路:1.病毒溯源 问题:求树的最长链长度和字典序最小的最长链 思路: 一开始用 bfs 做的 &a…...

917. 仅仅反转字母

917. 仅仅反转字母https://leetcode.cn/problems/reverse-only-letters/ 难度简单189 给你一个字符串 s ,根据下述规则反转字符串: 所有非英文字母保留在原有位置。所有英文字母(小写或大写)位置反转。 返回反转后的 s 。 示例…...

Linux-Git

一、总论 1.1 写在前面的话 ​ 这已经是我第三遍学Git相关操作了,可以说这个玩意是真的狗,因为确实用不到,不知道下个学期会不会用到,直到现在我刚刚学完,处于知识水平的巅峰,知道Git的具体功能&#xff…...

leetcode:2273. 移除字母异位词后的结果数组(python3解法)

难度&#xff1a;简单 给你一个下标从 0 开始的字符串 words &#xff0c;其中 words[i] 由小写英文字符组成。 在一步操作中&#xff0c;需要选出任一下标 i &#xff0c;从 words 中 删除 words[i] 。其中下标 i 需要同时满足下述两个条件&#xff1a; 0 < i < words.l…...

基于Python长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析等领域中的应用

植被是陆地生态系统中最重要的组分之一&#xff0c;也是对气候变化最敏感的组分&#xff0c;其在全球变化过程中起着重要作用&#xff0c;能够指示自然环境中的大气、水、土壤等成分的变化&#xff0c;其年际和季节性变化可以作为地球气候变化的重要指标。此外&#xff0c;由于…...

4.4---Spring框架之Spring事务(复习版本)

Spring事务的本质其实就是数据库对事务的支持&#xff0c;没有数据库的事务支持&#xff0c;spring是无法提供事务功能的。 Spring只提供统一事务管理接口&#xff0c;具体实现都是由各数据库自己实现&#xff0c;数据库事务的提交和回滚是通过 redo log 和 undo log实现的。 S…...

IP-Guard是否支持禁止客户端电脑卸载指定软件?

哪些浏览器支持设置窗口水印? 支持的浏览器有:搜狗浏览器、360安全浏览器、360极速浏览器、qq浏览器、谷歌浏览器、ie浏览器、edge浏览器 注意: 1.目标URL窗口水印不支持Firefox浏览器和猎豹浏览器 2.搜狗浏览器在兼容模式下,目标URL窗口水印不生效 3.部分浏览器(360安全…...

系统图标形状overlayapk

时间&#xff1a;2020/10/10 之前公司不允许csdn&#xff0c;笔记写在其它地方。最近整理过来 1、图标形状的overlay frameworks\base\packages\overlays目录 2、某一种形状的源码 默认配置在framework/base/core/res/res res下面放着图标形状的mask路径,这个值是一个矢量图…...

辅助编程coding的两种工具:Github Copilot、Cursor

目录Cursor简介下载地址&#xff1a;使用技巧&#xff1a;CHAT:example 1&#xff1a;注意&#xff1a;example 2&#xff1a;Github Copilot官网简介以插件方式安装pycharm自动写代码example 1&#xff1a;写一个mysql取数据的类example 2&#xff1a;写一个多重共线性检测的类…...

MySQL5.7安装教程

1.鼠标右击【MySQL5.7】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;选择【解压到 MySQL5.7】 2.打开解压后的文件夹&#xff0c;双击运行【mysql-installer-community-5.7.27.0】 3.勾选【I accept the license terms】&#xff0c;点击【Next】 4…...

ML@sklearn@ML流程Part3@AutomaticParameterSearches

文章目录Automatic parameter searchesdemomodel_selection::Hyper-parameter optimizersGridSearchCVegRandomizedSearchCVegNoteRandomForestRegressorMSEpipeline交叉验证&#x1f388;egL1L2正则Next stepsUser Guide vs TutorialAutomatic parameter searches Automatic p…...

Ubuntu22安装OpenJDK

目录 一、是否自带JDK 二、 删除旧JDK&#xff08;如果自带JDK满足需求就直接使用了&#xff09; 三、下载OpenJDK 四、新建/home/user/java/文件夹 五、 设置环境变量 六、查看完成 附&#xff1a;完整版连接&#xff1a; 一、是否自带JDK java -version 二、 删除旧…...

【数据库管理】②实例管理及数据库启动关闭

1. 实例和参数文件 1.1 instance 用于管理和访问 database. instance 在启动阶段读取初始化参数文件(init parameter files). 1.2 init parameter files [rootoracle-db-19c ~]# su - oracle [oracleoracle-db-19c ~]$ [oracleoracle-db-19c ~]$ cd $ORACLE_HOME/dbs [oracl…...

【2023】Kubernetes之Pod与容器状态关系

目录简单创建一个podPod运行阶段&#xff1a;容器运行阶段简单创建一个pod apiVersion: v1 kind: pod metadata: name: nginx-pod spec:containers:- name: nginximages: nginx:1.20以上代码表示创建一个名为nginx-pod的pod资源对象。 Pod运行阶段&#xff1a; Pod创建后&am…...

LabVIEW阿尔泰PCIE 5654 例程与相关资料

LabVIEW阿尔泰PCIE 5654 例程与相关资料 阿尔泰PCIE 5654多功能采集卡&#xff0c;具有500/250Ksps、32/16路模拟量输入&#xff1b;100Ksps&#xff0c;16位&#xff0c;4/2/0路同步电压模拟量输出&#xff1b;8路DIO &#xff1b;8路PFI&#xff1b;1路32位多功能计数器。PC…...

spark2.4.4有哪些主要的bug

Issue Navigator - ASF JIRA -...

信息学奥赛一本通 1347:【例4-8】格子游戏

【题目链接】 ybt 1347&#xff1a;【例4-8】格子游戏 【题目考点】 1. 并查集&#xff1a;判断无向图是否有环 【解题思路】 该题为判断无向图是否有环。可以使用并查集来完成。 学习并查集时&#xff0c;每个元素都由一个整数来表示。而该问题中每个元素是一个坐标点&a…...

acwing3417. 砝码称重

acwing3417. 砝码称重算法 1: DFS算法2 : DP算法 1: DFS /*** 数据范围 对于 50%的评测用例&#xff0c;1≤N≤15. 对于所有评测用例&#xff0c;1≤N≤100&#xff0c;N 个砝码总重不超过 1e5. */ /* 算法 1: DFS 思路 : 对于每个砝码,有放在左边,放在右边,和不放三种选择,使…...

生成式 AI:百度“文心一言”对标 ChatGPT?什么技术趋势促使 ChatGPT 火爆全网?

文章目录前言一、生成式 AI 的发展和现状1.1、什么是生成式 AI&#xff1f;1.2、生成式 AI 的发展趋势1.3、AI 生成内容的业务场景和分类二、生成式 AI 从分析领域到创作领域2.1、 降低内容创作门槛&#xff0c;增加 UGC 用户群体2.2、提升创作及反馈效率&#xff0c;铺垫线上实…...

Simulink仿真速度太慢?试试用C Mex S函数给模型“提提速”

Simulink性能优化实战&#xff1a;用C Mex S函数突破仿真速度瓶颈 当Simulink模型运行缓慢时&#xff0c;工程师们常常陷入漫长的等待。本文将揭示如何通过C Mex S函数这一利器&#xff0c;将仿真速度提升10倍以上&#xff0c;特别适合处理复杂算法、图像处理和大规模系统仿真等…...

Notepad++插件安装失败?手把手教你搞定NppFTP(含离线安装包和兼容性解决方案)

Notepad插件安装失败&#xff1f;手把手教你搞定NppFTP&#xff08;含离线安装包和兼容性解决方案&#xff09; 作为开发者日常必备的文本编辑器&#xff0c;Notepad凭借轻量高效的特点广受欢迎。而NppFTP插件更是让这款编辑器如虎添翼&#xff0c;实现了直接通过FTP/SFTP协议远…...

实测分享:圣女司幼幽-造相Z-Turbo生成高质量角色图片案例

实测分享&#xff1a;圣女司幼幽-造相Z-Turbo生成高质量角色图片案例 1. 引言&#xff1a;当AI画笔遇上经典角色 如果你是《牧神记》的读者&#xff0c;或者对国风仙侠角色情有独钟&#xff0c;那么“圣女司幼幽”这个名字一定不会陌生。她清冷孤傲、手持长剑的形象早已深入人…...

Phi-4-mini-reasoning实操手册:vLLM日志分析与常见加载失败排障指南

Phi-4-mini-reasoning实操手册&#xff1a;vLLM日志分析与常见加载失败排障指南 1. 模型简介 Phi-4-mini-reasoning是一个基于合成数据构建的轻量级开源模型&#xff0c;专注于高质量、密集推理的数据处理能力。作为Phi-4模型家族的一员&#xff0c;它经过专门微调以提升数学…...

WebLogic T3协议漏洞实战:5分钟搞定ConnectionFilterImpl配置(附常见问题排查)

WebLogic T3协议安全加固实战&#xff1a;ConnectionFilterImpl配置与深度防御指南 1. 漏洞背景与防御必要性 WebLogic作为企业级Java应用服务器&#xff0c;其专有的T3协议长期存在反序列化漏洞风险。攻击者通过构造恶意T3协议数据包&#xff0c;可在未授权情况下实现远程代码…...

终极PDF Arranger常见问题FAQ:解决用户最关心的30个疑问

终极PDF Arranger常见问题FAQ&#xff1a;解决用户最关心的30个疑问 【免费下载链接】pdfarranger Small python-gtk application, which helps the user to merge or split PDF documents and rotate, crop and rearrange their pages using an interactive and intuitive gra…...

Ryujinx:C编写的Nintendo Switch模拟器技术解析与应用指南

Ryujinx&#xff1a;C#编写的Nintendo Switch模拟器技术解析与应用指南 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx Ryujinx是一款用C#编写的实验性Nintendo Switch模拟器&#xff…...

FOIL框架实战:用不变学习破解时间序列预测的OOD难题

1. 当时间序列预测遇上OOD难题&#xff1a;从业务痛点说起 去年冬天&#xff0c;我接手了一个零售销量预测项目。客户兴奋地展示着他们在历史数据上达到95%准确率的LSTM模型&#xff0c;但实际部署后&#xff0c;这个"明星模型"在新年促销季的预测误差突然飙升到40%。…...

【LangGraph】 官方demo调整为本地大模型实现

官网文档链接&#xff1a; https://docs.langchain.com/oss/python/langgraph/quickstart#full-code-example 样例代码&#xff1a; # 第一步&#xff1a;定义工具与大模型 # 导入LangChain工具装饰器&#xff0c;用于将普通函数封装为Agent可调用的工具 from langchain.tool…...

Windows 系统安装 MySQL

访问 MySQL 官方下载页&#xff1a;https://dev.mysql.com/downloads/installer/ 选择 “MySQL Installer for Windows”&#xff0c;推荐下载 “mysql-installer-community-8.0.36.msi”&#xff08;社区版&#xff0c;免费&#xff09; 启动后会看到安装类型选择界面&#xf…...