Thread类的基本用法
Thread类的基本用法
- 🔎1.线程创建
- 🌻继承Thread类
- 🌼继承Thread重写run()方法
- 🌼继承Thread匿名内部类
- 🌻实现Runnable接口
- 🌼实现Runnable接口重写run()方法
- 🌼实现Runnable接口匿名内部类
- 🌻使用Lambda表达式
- 🔎2.线程中断
- 🌻线程立即中断
- 🌻稍等片刻中断
- 🌻线程不中断
- 🔎3.线程等待
- 🔎4.线程休眠
- 🔎5.线程的六种状态
- 🔎结尾
🔎1.线程创建
线程创建的3种方式
- 继承Thread类
- 实现Runnable接口
- 使用Lambda表达式
🌻继承Thread类
🌼继承Thread重写run()方法
class ExThread extends Thread {@Overridepublic void run() {System.out.println("通过继承Thread类创建线程");}
}public class Main{public static void main(String[] args) {Thread t = new ExThread();//启动线程t.start();}
}
🌼继承Thread匿名内部类
public class HomeWork {public static void main(String[] args) {Thread t = new Thread() {@Overridepublic void run() {System.out.println("通过继承Thread类创建线程");}};}
}
🌻实现Runnable接口
🌼实现Runnable接口重写run()方法
class ExRunnable implements Runnable {@Overridepublic void run() {System.out.println("通过实现Runnable接口创建线程");}
}public class HomeWork {public static void main(String[] args) {ExRunnable runnable = new ExRunnable();Thread t = new Thread(runnable);//启动线程t.start();}
}
🌼实现Runnable接口匿名内部类
public class HomeWork {public static void main(String[] args) {Thread t = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("通过实现Runnable接口创建线程");}});}
}
🌻使用Lambda表达式
public class HomeWork {public static void main(String[] args) {Thread t = new Thread(() -> {System.out.println("使用Lambda创建线程"); });}
}
🔎2.线程中断
线程中断就是让线程停下来
那么如何才能让线程停下来呢?
那就是让该线程的入口方法执行完毕
下面来简单介绍下3种线程中断的情况
1.线程立即中断
2.线程稍等片刻中断
3.线程不中断
举个栗子
你正在打游戏,然后你的女朋友打电话叫你去陪她逛街
这时候你有3个选择
1.立刻把游戏停了陪她逛街(线程立即中断)
2.和她说打完这把再去(线程稍等片刻中断)
3.直接把电话挂了,继续打游戏(线程不中断)
下面来看下代码
🌻线程立即中断
public class Main {public static void main(String[] args) {Thread t = new Thread(() -> {//currentThread是获取到当前线程的实例//此处currentThread()得到的对象就是t//isInterrupted()是t对象自带的标志位-->默认是false//可以理解成while(!false) --> while(true) --> 死循环while(!Thread.currentThread().isInterrupted()) {System.out.println("hello t1");try {//休眠0.5sThread.sleep(500);} catch(InterruptedException e) {e.printStackTrace();break;}}System.out.println("线程立即中断");});//启动线程t.start();try {//休眠3sThread.sleep(3000);} catch(InterruptedException e) {e.printStackTrace();}t.interrupt();//将标志位设置为true}
}
🌻稍等片刻中断
public class Test1 {public static void main(String[] args) {Thread t = new Thread(() -> {while(!Thread.currentThread().isInterrupted()) {System.out.println("hello t2");try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();try {Thread.sleep(1000);} catch (InterruptedException ee) {ee.printStackTrace();}break;}}System.out.println("线程稍等片刻中断");});//启动线程t.start();try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}t.interrupt();}
}
🌻线程不中断
public class Test1 {public static void main(String[] args) {Thread t = new Thread(() -> {while(!Thread.currentThread().isInterrupted()) {System.out.println("hello t3");try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("线程不中断");});//启动线程t.start();try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}t.interrupt();}
}
🔎3.线程等待

等于这上述代码
我们无法确定打印顺序
先输出hello t 还是先输出hello bibu

但在main线程加入了t.join()(线程等待)之后,就会先去打印hello t了
这是因为在main线程中加入t.join(),如果此时的 t线程还没有执行完,main线程就会发生堵塞
也就是说,等到 t线程执行完毕后再去执行main线程的程序
需要注意的是
- 在t1线程中调用t2.join(),就是t2先执行完毕再去执行t1
- 在t2线程种调用t3.join(),就是t3先执行完毕再去执行t2
- t.join()这个方法也可以设置一个时间

解释
- 这里设置的时间就是说最多等待 t线程执行1000ms(1s),如果还没有执行完.那main线程就会继续执行
- 举个栗子
- 你的女朋友让你在她宿舍楼下等她10分钟
- 你可以选择一直等着她( t.join())
- 也可以选择就等10分钟( t.join(1000))
🔎4.线程休眠
让线程进入一定时间的停止
public class Main{public static void main(String[] args) {Thread t = new Thread(() -> {while(true) {try {//让线程进入休眠Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}});t.start();}
}
🔎5.线程的六种状态
- NEW: 安排了工作, 还未开始行动
- RUNNABLE: 就绪状态. 又可以分成正在工作中和即将开始工作
- TERMINATED:系统中的线程已经执行完了,Thread对象还在
- TIMED_WATING:指定时间等待
- BLOCKED:等待出现状态
- WAITING:使用wait方法出现的状态
具体参考: 多线程的几种状态
🔎结尾
如果大家有什么不太理解的,可以私信或者评论区留言,一起加油
相关文章:
Thread类的基本用法
Thread类的基本用法🔎1.线程创建🌻继承Thread类🌼继承Thread重写run()方法🌼继承Thread匿名内部类🌻实现Runnable接口🌼实现Runnable接口重写run()方法🌼实现Runnable接口匿名内部类ἳ…...
YOLOV8改进:如何增加注意力模块?(以CBAM模块为例)
YOLOV8改进:如何增加注意力模块?(以CBAM模块为例)前言YOLOV8nn文件夹modules.pytask.pymodels文件夹总结前言 因为毕设用到了YOLO,鉴于最近V8刚出,因此考虑将注意力机制加入到v8中。 YOLOV8 代码地址&am…...
Spark Streaming DStream的操作
一、DStream的定义 DStream是离散流,Spark Streaming提供的一种高级抽象,代表了一个持续不断的数据流。DStream可以通过输入数据源来创建,比如Kafka、Flume,也可以通过对其他DStream应用高阶函数来创建,比如map、redu…...
蓝桥杯冲刺 - week1
文章目录💬前言🌲day192. 递归实现指数型枚举843. n-皇后问题🌲day2日志统计1209. 带分数🌲day3844. 走迷宫1101. 献给阿尔吉侬的花束🌲day41113. 红与黑🌲day51236. 递增三元组🌲day63491. 完全…...
Leetcode27. 移除元素
目录一、题目描述:二、解决思路和代码1. 解决思路2. 代码一、题目描述: 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用…...
ViewService——一种保证客户端与服务端同步的方法
简介在分布式系统中,最常见的场景就是主备架构。但是如果主机不幸宕机,如何正确的通知客户端当前后端服务器的状况成为一个值得研究的问题。本文描述了一种简单的模型用于解决此问题。背景以一个分布式的Key-Value数据库为背景。数据库对外提供3个接口Ge…...
使用STM32F103ZE开发贪吃蛇游戏
目录 前言 一、设置FreeROTS用户任务 (1)事件event任务 (2)按键输入方向控制任务 (3)果实食物任务 (4)显示任务函数 (3)开始任务 二、主函数 三、ADC采样…...
如何利用Web3D技术打造在线虚拟展览馆
随着Web3D技术的不断发展,越来越多的企业和组织开始将其应用于虚拟展览馆的建设中。虚拟展览馆可以为观众提供高度沉浸式的展览体验,让观众可以随时随地参观各种展览,同时也为展览组织者提供了更多的展示方式和机会。下面将介绍如何利用Web3D…...
第二十三章 opengl之高级OpenGL(实例化)
OpenGL实例化实例化数组绘制小行星带实例化 综合应用。 如果绘制了很多的模型,但是大部分的模型包含同一组顶点数据,只是不同的世界空间变换。 举例:一个全是草的场景,每根草都是一个包含了几个小三角形的模型。需要绘制很多根草…...
C++ String类总结
头文件 #include <string>构造函数 default (1) basic_string();explicit basic_string (const allocator_type& alloc); copy (2) basic_string (const basic_string& str);basic_string (const basic_string& str, const allocator_type& alloc); su…...
内网升级“高效安全”利器!统信软件发布私有化更新管理平台
随着数字化的深度推进,信息安全重要性进一步凸显。建设自主可控的国产操作系统,提升信息安全自主能力,已成为国家重要战略之一。 操作系统安全对计算机系统的整体安全发挥着关键作用,各类客户往往需要在第一时间获取更新与安全补…...
JAVA开发(自研项目的开发与推广)
https://live.csdn.net/v/284629 案例背景: 作为JAVA开发人员,我们可以开发无数多的web项目,电商系统,小程序,H5商城。有时候作为技术研发负责人,项目做成了有时候也需要对内进行内测,对外进行…...
Mysql用户权限分配详解
文章目录MySQL 权限介绍一、Mysql权限级别分析(1)全局级别(1.1) USER表的组成结构(1.1.1) 用户列(1.1.2) 权限列(1.1.3) 安全列(1.1.4)…...
【TypeScript 入门】13.枚举类型
枚举类型 枚举类型:定义包含被命名的常量的集合。比如 TypeScript 支持枚举数字、字符两种常量值类型。 使用方式: enum + 枚举名字 + 花括弧包裹被命名了的常量成员: enum Size {S,M,L } const a = Size.M console.log(Size, Size)...
Python科学计算:偏微分方程1
首先,我们来看初边值问题:伯格斯方程:假设函数是定义在上的函数,且满足:右侧第一项表示自对流,第二项则表示扩散,在许多物理过程中,这两种效应占据着主导地位,为了固定一…...
PLS-DA分类的实现(基于sklearn)
目录 简单介绍 代码实现 数据集划分 选择因子个数 模型训练并分类 调用函数 简单介绍 (此处取自各处资料) PLS-DA既可以用来分类,也可以用来降维,与PCA不同的是,PCA是无监督的,PLS-DA是有监督的…...
常用hook
Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。理解:hook是react提供的函数API官方提供的hook基础hookuseState APIconst [state, setState] useState(initialState); //返回state值 以及更新state的方法 …...
TryHackMe-GoldenEye(boot2root)
GoldenEye 这个房间将是一个有指导的挑战,以破解詹姆斯邦德风格的盒子并获得根。 端口扫描 循例nmap Web枚举 进入80 查看terminal.js 拿去cyberchef解码 拿着这组凭据到/sev-home登录 高清星际大战 POP3枚举 使用刚刚的凭据尝试登录pop3 使用hydra尝试爆破 这…...
Elasticsearch基本安全加上安全的 HTTPS 流量
基本安全加上安全的 HTTPS 流量 在生产环境中,除非您在 HTTP 层启用 TLS,否则某些 Elasticsearch 功能(例如令牌和 API 密钥)将被禁用。这个额外的安全层确保进出集群的所有通信都是安全的。 当您在模式下运行该elasticsearch-ce…...
C语言-程序环境和预处理(2)
文章目录预处理详解1.预定义符号2.#define2.1#define定义的标识符2.2#define定义宏2.3#define替换规则注意事项:2.4#和###的作用##的作用2.5带副作用的宏参数2.6宏和函数的对比宏的优势:宏的劣势:宏和函数的一个对比命名约定3.undef4.条件编译…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
