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

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接口匿名内部类&#x1f33…...

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…...

内网升级“高效安全”利器!统信软件发布私有化更新管理平台

随着数字化的深度推进&#xff0c;信息安全重要性进一步凸显。建设自主可控的国产操作系统&#xff0c;提升信息安全自主能力&#xff0c;已成为国家重要战略之一。 操作系统安全对计算机系统的整体安全发挥着关键作用&#xff0c;各类客户往往需要在第一时间获取更新与安全补…...

JAVA开发(自研项目的开发与推广)

https://live.csdn.net/v/284629 案例背景&#xff1a; 作为JAVA开发人员&#xff0c;我们可以开发无数多的web项目&#xff0c;电商系统&#xff0c;小程序&#xff0c;H5商城。有时候作为技术研发负责人&#xff0c;项目做成了有时候也需要对内进行内测&#xff0c;对外进行…...

Mysql用户权限分配详解

文章目录MySQL 权限介绍一、Mysql权限级别分析&#xff08;1&#xff09;全局级别&#xff08;1.1&#xff09; USER表的组成结构&#xff08;1.1.1&#xff09; 用户列&#xff08;1.1.2&#xff09; 权限列&#xff08;1.1.3&#xff09; 安全列&#xff08;1.1.4&#xff09…...

【TypeScript 入门】13.枚举类型

枚举类型 枚举类型:定义包含被命名的常量的集合。比如 TypeScript 支持枚举数字、字符两种常量值类型。 使用方式: enum + 枚举名字 + 花括弧包裹被命名了的常量成员: enum Size {S,M,L } const a = Size.M console.log(Size, Size)...

Python科学计算:偏微分方程1

首先&#xff0c;我们来看初边值问题&#xff1a;伯格斯方程&#xff1a;假设函数是定义在上的函数&#xff0c;且满足&#xff1a;右侧第一项表示自对流&#xff0c;第二项则表示扩散&#xff0c;在许多物理过程中&#xff0c;这两种效应占据着主导地位&#xff0c;为了固定一…...

PLS-DA分类的实现(基于sklearn)

目录 简单介绍 代码实现 数据集划分 选择因子个数 模型训练并分类 调用函数 简单介绍 &#xff08;此处取自各处资料&#xff09; PLS-DA既可以用来分类&#xff0c;也可以用来降维&#xff0c;与PCA不同的是&#xff0c;PCA是无监督的&#xff0c;PLS-DA是有监督的…...

常用hook

Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。理解&#xff1a;hook是react提供的函数API官方提供的hook基础hookuseState APIconst [state, setState] useState(initialState); //返回state值 以及更新state的方法 …...

TryHackMe-GoldenEye(boot2root)

GoldenEye 这个房间将是一个有指导的挑战&#xff0c;以破解詹姆斯邦德风格的盒子并获得根。 端口扫描 循例nmap Web枚举 进入80 查看terminal.js 拿去cyberchef解码 拿着这组凭据到/sev-home登录 高清星际大战 POP3枚举 使用刚刚的凭据尝试登录pop3 使用hydra尝试爆破 这…...

Elasticsearch基本安全加上安全的 HTTPS 流量

基本安全加上安全的 HTTPS 流量 在生产环境中&#xff0c;除非您在 HTTP 层启用 TLS&#xff0c;否则某些 Elasticsearch 功能&#xff08;例如令牌和 API 密钥&#xff09;将被禁用。这个额外的安全层确保进出集群的所有通信都是安全的。 当您在模式下运行该elasticsearch-ce…...

C语言-程序环境和预处理(2)

文章目录预处理详解1.预定义符号2.#define2.1#define定义的标识符2.2#define定义宏2.3#define替换规则注意事项&#xff1a;2.4#和###的作用##的作用2.5带副作用的宏参数2.6宏和函数的对比宏的优势&#xff1a;宏的劣势&#xff1a;宏和函数的一个对比命名约定3.undef4.条件编译…...

Visual Studio 2019安装Python组件失败?教你手动定位installer目录完成安装

Visual Studio 2019安装Python组件失败的终极解决方案 当你在Visual Studio 2019中尝试安装Python组件时&#xff0c;突然遇到"安装程序不完整"的错误提示&#xff0c;这确实令人沮丧。作为一名长期使用VS进行Python开发的工程师&#xff0c;我完全理解这种中断对工作…...

Mac 版 SSH 登录脚本

Mac 版 SSH 登录脚本 整合原有编码机器人 + 新增飞书运营机器人,分区域展示、带完整名称/备注/专线IP,一键登录,Mac 专属、直接可用! 前置准备(仅执行1次) brew install sshpass完整脚本(复制保存为 robot_ssh.sh) #!/bin/bash # Mac 专用 - 编码机器人 + 飞书机器…...

ai辅助开发:让快马平台为你的arduino项目注入智能决策与学习能力

AI辅助开发&#xff1a;让快马平台为你的Arduino项目注入智能决策与学习能力 最近在做一个智能垃圾分类的小项目&#xff0c;用Arduino控制各种传感器和舵机来实现自动分类。这个过程中发现&#xff0c;手动编写所有判断逻辑和阈值调整特别耗时&#xff0c;于是尝试用InsCode(…...

Spring Boot 3.2项目实战:5分钟搞定Tomcat虚拟线程配置,让你的接口吞吐量翻倍

Spring Boot 3.2虚拟线程实战&#xff1a;Tomcat配置优化与性能飞跃指南 当你的电商大促接口突然面临每秒上万请求&#xff0c;或者文件上传服务在高并发下响应缓慢时&#xff0c;传统线程池往往成为性能瓶颈。Spring Boot 3.2与Java 21的虚拟线程组合&#xff0c;正在重新定义…...

Web地图开发避坑指南:墨卡托和UTM坐标系到底怎么选?

Web地图开发坐标系选择指南&#xff1a;墨卡托与UTM的深度对比 当我们打开手机地图应用查看附近餐厅时&#xff0c;很少有人会思考背后复杂的坐标系转换过程。作为一名长期从事WebGIS开发的工程师&#xff0c;我见过太多项目因为坐标系选择不当而导致定位偏移、性能下降甚至数据…...

同架构大数据量HGDB到HGDB数据迁移

文章目录环境文档用途详细信息环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7,银河麒麟 &#xff08;X86_64&#xff09; 版本&#xff1a;4.5.8 文档用途 本文介绍同架构大数据量情况下&#xff0c;为了减少停机时间&#xff0c;先搭建流复制同步数据&…...

OpCore-Simplify:智能配置驱动的OpenCore EFI自动化构建工具

OpCore-Simplify&#xff1a;智能配置驱动的OpenCore EFI自动化构建工具 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify &#x1f914; 配置黑苹果的痛…...

数电课设实战:从555定时器到74LS190,手把手搭建一个密码锁系统

1. 密码锁系统设计概述 第一次接触数字电路课设时&#xff0c;我和大多数同学一样&#xff0c;面对一堆芯片和电路图完全无从下手。直到教授建议从密码锁这个经典项目入手&#xff0c;我才发现原来数电可以这么有趣。这个系统最精妙的地方在于&#xff0c;它把课本上枯燥的理论…...

Python环境变量冲突避坑指南:解决Fatal Python error: init_sys_streams错误(conda+Pycharm版)

Python环境变量冲突避坑指南&#xff1a;解决Fatal Python error: init_sys_streams错误&#xff08;condaPycharm版&#xff09; 当你在PyCharm中运行一个conda虚拟环境下的Python项目时&#xff0c;突然弹出一条令人窒息的错误信息&#xff1a;Fatal Python error: init_sys_…...

Realistic Vision V5.1 创意工作流:利用GitHub管理提示词库与生成作品版本

Realistic Vision V5.1 创意工作流&#xff1a;利用GitHub管理提示词库与生成作品版本 你有没有遇到过这种情况&#xff1f;团队里每个人都在用Realistic Vision V5.1生成图片&#xff0c;但大家用的提示词五花八门&#xff0c;好的描述词散落在各个聊天记录里&#xff0c;生成…...