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

JUC-常见方法与线程的状态

常见方法

start()与run()

主线程直接调用某个线程t1的run()方法,run方法也会执行,但是并不会启动新的线程,而是有主线程调用的run方法,必须使用start才能启动新线程,但是start只能调用一次。

sleep()与yield()

sleep:

  1. sleep可以使一个线程的状态由RUNNING变为TIMED_WAITING
  2. sleep() 方法的过程中,线程不会释放对象锁

使用sleep可以防止CPU占用100%

while(true) {try {Thread.sleep(2);} catch (InterruptedException e) {throw new RuntimeException(e);}
}
  • 可以使用wait或条件变量达到类似的效果,不同的是这两种都需要加锁,并且需要相应的唤醒操作。
  • sleep适用于无锁同步的场景。

yield:

  1. 允许具有相同优先级的其他线程获得运行机会。
  2. 会放弃 CPU 资源,锁资源不会释放

join方法

当调用某个线程(t1)的join方法后,该线程(t1)抢占到CPU资源,就不再释放,直到线程执行完毕。join本质上是一个对象锁,是被synchronized修饰的。

join实现线程同步,因为会阻塞等待另一个线程的结束,才能继续向下运行

  • 需要外部共享变量,不符合面向对象封装的思想
  • 必须等待线程结束,不能配合线程池使用

interrupt

  • public void interrupt(),打断当前线程:
    • 当打断阻塞(sleep、wait、join 方法都会让线程进入阻塞状态)的线程是会抛出一个异常,其会清空打断状态,也即打断标记为false。如果在一个线程执行sleep之前就已经执行了interrupt方法,那么当他执行到sleep会立即抛出异常。
    • 当打断一个正常的线程时,不会抛出异常,而且不会清空打断状态,也即打断标记为true。
  • public boolean isInterrupted(),判断当前线程是否被打断,打断返回true,不清除打断标记
  • public static boolean interrupted(),判断当前线程是否被打断,打断返回true,清除打断标记,连续调用两次一定返回false。

关于interrupt有一个设计模式,即终止模式之两阶段终止模式(Two Phase Termination)

daemon

public final void setDaemon(boolean on):如果是 true ,将此线程标记为守护线程;在start之前调用该方法。
守护线程,只要其它非守护线程运行结束了,即使守护线程代码没有执行完,也会强制结束。守护进程是脱离于终端并且在后台运行的进程

常见的守护线程:

  • 垃圾回收器线程就是一种守护线程
  • Tomcat 中的 Acceptor 和 Poller 线程都是守护线程,所以 Tomcat 接收到 shutdown 命令后,不会等待它们处理完当前请求

线程的状态

在操作系统中,有5种状态:新建、就绪、运行、阻塞、死亡。而在Java种则是由不同的定义,Thread.State中给了Java中线程的6个状态:

public enum State {NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED;}

![[Pasted image 20240712104539.png]]

其中RUNNABLE就包括了操作系统种的就绪、运行、阻塞三种状态。

线程状态导致状态发生条件
NEW(新建)线程刚被创建,但是并未启动,还没调用 start 方法,只有线程对象,没有线程特征
Runnable(可运行)线程可以在Java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操作系统处理器,调用了t.start()方法:就绪(经典叫法)
Blocked(阻塞)当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态;当该线程持有锁时,该线程将变成 Runnable 状态
Waiting(无限等待)一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态,进入这个状态后不能自动唤醒,必须等待另一个线程调用 notify 或者 notifyAll 方法才能唤醒
Timed Waiting (限期等待)有几个方法有超时参数,调用将进入Timed Waiting状态,这一状态将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread.sleep 、Object.wait
Teminated(结束)run方法正常退出而死亡,或者因为没有捕获的异常终止了 run 方法而死亡
package com.qcby.case1;import lombok.extern.slf4j.Slf4j;@Slf4j
public class Test5 {public static void main(String[] args) throws InterruptedException {// t1处于NEWThread t1 = new Thread("t1");// t2一定能执行完,处于TERMINATEDThread t2 = new Thread(() -> {}, "t2");// t3处于RUNNABLEThread t3 = new Thread(() -> {while (true) {}}, "t3");// t4和t5都尝试取获取同一个类锁,// 那么先获取到的处于TIMED_WAITING// 后获取到的处于BLOCKEDThread t4 = new Thread(() -> {synchronized (Test5.class) {try {Thread.sleep(10000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}, "t4");Thread t5 = new Thread(() -> {synchronized (Test5.class) {try {Thread.sleep(10000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}, "t5");// t6进入Waiting状态,需要等待t4执行完毕,才被唤醒Thread t6 = new Thread(() -> {try {t4.join();} catch (InterruptedException e) {throw new RuntimeException(e);}}, "t6");t2.start();t3.start();t4.start();t5.start();t6.start();Thread.sleep(1000);log.info("t1的状态是:{}", t1.getState());log.info("t2的状态是:{}", t2.getState());log.info("t3的状态是:{}", t3.getState());log.info("t4的状态是:{}", t4.getState());log.info("t5的状态是:{}", t5.getState());log.info("t6的状态是:{}", t6.getState());}}

![[Pasted image 20240712110315.png]]

相关文章:

JUC-常见方法与线程的状态

常见方法 start()与run() 主线程直接调用某个线程t1的run()方法,run方法也会执行,但是并不会启动新的线程,而是有主线程调用的run方法,必须使用start才能启动新线程,但是start只能调用一次。 sleep()与yield() sle…...

如果你酿的酒是黄色,说明肯定是 “糊锅”了。

刚刚酿出的酒一般都是清澈见底的,如果你酿的酒是黄色,说明肯定是 “糊锅”了。这样的酒不仅颜色是黄的,而且还能闻到一股特别浓厚的 焦糊味。 这样的酒,米酒小哥是非常非常熟悉的,因为刚开始学习酿酒的那段时 间&#…...

国漫推荐07

玄幻、奇幻 1.侠岚系列 《侠岚》(第1至6季) 《画江湖之侠岚》(侠岚第7季) 2.《斗破苍穹》 三十年河东,三十年河西,莫欺少年穷! 3.《武动乾坤》(第1至4季) 4.《妖神记》…...

力扣刷题35.搜索查找位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入:…...

setContentView 流程

setContentView 流程 Activity -> setContentView 开发者设置入口PhoneWindow -> setContentView mWindow 在 attach 时初始化为 PhoneWindow,同时PhoneWindow也是Window唯一的实现类PhoneWindow -> installDecor 这一步的作用是 初始化DecorView, 把Deco…...

基于STM32设计的智能手环(ESP8266+华为云IOT)178

基于STM32设计的智能手环(178) 文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】项目硬件模块组成【3】ESP8266工作模式配置【4】Android手机APP开发思路【5】项目模块划分1.2 项目功能需求(1)生理参数监测(2)计步功能(3)GPS定位(4)时间显示(5)OLED显示屏展示(…...

EE trade:实物黄金投资的好处和坏处

实物黄金是指以金条、金币、金饰品等形式存在的黄金。实物黄金具有保值、避险、抗通胀等特性,被视为传统的投资避险工具。近年来,随着全球经济形势的不确定性增加,实物黄金的投资价值也受到越来越多的关注。 投资实物黄金的优势 保值性&…...

Flutter RSA公钥转PEM

需添加依赖:pointycastle​​​​​​​ 参考链接:https://github.com/bcgit/pc-dart/issues/165 import dart:convert; import dart:typed_data;import package:pointycastle/pointycastle.dart; import package:pointycastle/src/platform_check/pl…...

下载站怎么防护DDOS攻击

下载站怎么防护DDOS攻击?随着互联网的发展,下载站作为资源分享的重要平台,面临着日益严峻的DDoS(分布式拒绝服务)攻击威胁。DDoS攻击通过大量恶意请求占用网络资源,导致服务器响应缓慢甚至瘫痪,…...

docker拉取镜像-配置阿里云镜像加速

1、配置阿里云镜像&#xff08;用于拉取镜像加速&#xff09; sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo syst…...

ai写作软件哪个好?亲测好用的5款工具分享

一眨眼&#xff0c;初伏就要到来了~办公室内的高温仿佛连空气都凝固了&#xff0c;键盘敲击声似乎都变得沉重而迟缓。在这样的天气下&#xff0c;创意与灵感似乎也躲进了阴凉处&#xff0c;办公效率显然大打折扣。 幸运的是&#xff0c;被我找到了新的应对之策&#xff0c;那便…...

Blender 中导出模型fbx

准备模型&#xff1a;确保你的模型已经完成&#xff0c;并且所有的材质、纹理等都已设置好。 应用所有变换&#xff1a; 选择模型&#xff0c;按下 CtrlA&#xff0c;选择 "All Transforms" 以应用所有的变换&#xff08;位置、旋转和缩放&#xff09;。 导出模型&a…...

景联文科技以高质量多模态数据集赋能AI大模型,精准匹配提升模型性能

在人工智能的浪潮中&#xff0c;语料数据如同建筑的基石&#xff0c;其质量、规模和运用策略直接决定了AI模型的表现和应用的广泛性。 景联文科技在AI领域深耕多年&#xff0c;打磨了高质量多模态数据集&#xff0c;致力于为不同训练阶段的算法精准匹配高质量数据资源。 3000万…...

【ROS2】中级:tf2-编写监听器(Python)

目标&#xff1a;学习如何使用 tf2 获取帧变换。 教程级别&#xff1a;中级 时间&#xff1a;10 分钟 目录 背景 先决条件 任务 1. 编写监听节点2. 更新启动文件3. 构建4. 运行 摘要 背景 在之前的教程中&#xff0c;我们创建了一个 tf2 广播器来发布乌龟的姿态到 tf2。 在本教…...

用QFramework重构飞机大战(Siki Andy的)(下02)(06-0? 游戏界面及之后的所有面板)

用QFramework重构飞机大战(Siki Andy的)&#xff08;下02&#xff09;&#xff08;06-0&#xff1f; 游戏界面及之后的所有面板&#xff09; GitHub // 官网的 全民飞机大战&#xff08;第一季&#xff09;-----框架设计篇&#xff08;Unity 2017.3&#xff09; 全民飞机大战&…...

Apifox报错404:网络错误,请检查网络,或者稍后再试的解决办法

详细报错如图&#xff1a; 解决办法&#xff1a; 1、检查 请求方法&#xff08;get&#xff0c;post&#xff09;是否正确&#xff0c;请求的URL是否正确&#xff0c;如果不正确&#xff0c;修改后重新发起请求&#xff1b;如果都正确&#xff0c;再参考2 2、复制curl用postm…...

腾讯混元大模型集成LangChain

腾讯混元大模型集成LangChain 获取API密钥 登录控制台–>访问管理–>API密钥管理–>新建密钥&#xff0c;获取到SecretId和SecretKey。访问链接&#xff1a;https://console.cloud.tencent.com/cam/capi python SDK方式调用大模型 可参考腾讯官方API import json…...

C++心决之stl中那些你不知道的秘密(string篇)

目录 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 2. 标准库中的string类 2.1 string类 2.2 string类的常用接口说明 1. string类对象的常见构造 2. string类对象的操作 3.vs和g下string结构的说明 3. string类的模拟实现 3.2 浅拷贝 3.3 深拷贝 3.4 写…...

date 命令学习

文章目录 date 命令学习1. 命令简介2. 语法参数2.1 使用语法2.2 说明2.3 参数说明 3. 使用案例:arrow_right: 星期名缩写 %a:arrow_right: 星期名全写 %A:arrow_right: 月名缩写 %b:arrow_right: 月名全称 %B:arrow_right: 日期和时间 %c:arrow_right: 世纪 %C:arrow_right: 按…...

前端vue后端java使用easyexcel框架下载表格xls数据工具类

一 使用alibaba开源的 easyexcel框架&#xff0c;后台只需一个工具类即可实现下载 后端下载实现 依赖 pom.xml <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependen…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”

非常好&#xff0c;我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题&#xff0c;统一使用 二重复合函数&#xff1a; z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y))​ 来全面说明。我们会展示其全微分形式&#xff08;偏导…...

CentOS 7.9安装Nginx1.24.0时报 checking for LuaJIT 2.x ... not found

Nginx1.24编译时&#xff0c;报LuaJIT2.x错误&#xff0c; configuring additional modules adding module in /www/server/nginx/src/ngx_devel_kit ngx_devel_kit was configured adding module in /www/server/nginx/src/lua_nginx_module checking for LuaJIT 2.x ... not…...

中国政务数据安全建设细化及市场需求分析

(基于新《政务数据共享条例》及相关法规) 一、引言 近年来,中国政府高度重视数字政府建设和数据要素市场化配置改革。《政务数据共享条例》(以下简称“《共享条例》”)的发布,与《中华人民共和国数据安全法》(以下简称“《数据安全法》”)、《中华人民共和国个人信息…...