线程进入WAITING的N种方式
目录
一、调用 Object 的 wait 方法
二、调用 Thread.join 方法
三、调用LockSupport.park()方法
一、调用 Object 的 wait 方法
public static void main(String[] args) throws InterruptedException {// 创建一个锁对象Object lock = new Object();Thread thread = new Thread(()->{synchronized (lock){System.out.println("线程进入WAITING状态");try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("1秒后,线程被唤醒🤭");}});thread.start();System.out.println("该线程刚启动时的状态:"+thread.getState());// 确保thread线程先执行Thread.sleep(1000);System.out.println("线程调用wait方法后的状态:"+thread.getState());synchronized (lock){lock.notify();System.out.println("线程被唤醒后的状态:"+thread.getState());}}
从输出结果可以看出,线程通过调用 start 方法启动后,通过执行 run 方法的代码逻辑进入 WAITING状态,1秒后通过调用 notify 方法对该线程进行唤醒后,线程进入 BLOCKED 状态。
此时我们可能有疑问,如果调用 Thread.sleep方法呢?线程会进入什么状态呢?接下来通过代码演示效果:
public static void main(String[] args) throws InterruptedException {// 创建一个锁对象Object lock = new Object();Thread thread = new Thread(()->{synchronized (lock){System.out.println("线程进入WAITING状态");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("1秒后,线程被唤醒🤭");}});thread.start();System.out.println("该线程刚启动时的状态:"+thread.getState());// 确保thread线程先执行Thread.sleep(1000);System.out.println("线程调用wait方法后的状态:"+thread.getState());synchronized (lock){lock.notify();System.out.println("线程被唤醒后的状态:"+thread.getState());}}
在Java中,当线程调用Thread.sleep()
方法时,线程会进入 TIMED_WAITING
状态,而不是WAITING
状态。TIMED_WAITING
是一种有时限的等待,它们之间有有着如下区别:
状态 | 触发条件 | 恢复条件 |
TIMED_WAITING | 调用Thread.sleep、Object.wait(long timeout)等带有超时参数的方法 | 等待时间到期或者被中断 |
WAITING | 调用Object.wait()、Thread.join()、LockSupport.park()等无超时参数的方法 | 被其他线程唤醒 |
二、调用 Thread.join 方法
public static void main(String[] args) throws InterruptedException {Thread mainThread = Thread.currentThread();Thread thread = new Thread(()->{try {System.out.println("Thread线程执行相关的业务逻辑");System.out.println("主线程的状态:"+mainThread.getState());Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Thread线程执行完毕");});thread.start();thread.join();System.out.println("主线程等待子线程执行结束后,执行非重要任务");}
由于子线程在休眠,观察到主线程刚好处于 WAITING 状态
三、调用LockSupport.park()
方法
public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(()->{System.out.println("线程进入WAITING状态");LockSupport.park();System.out.println("线程被唤醒");});thread.start();Thread.sleep(1000);System.out.println("子线程的状态:"+thread.getState());LockSupport.unpark(thread);}
通过调用 concurrent 并发编程包下的 park 方法使子线程进入 WAITING状态,然后通过 unpark 方法唤醒 thread 线程。
相关文章:
线程进入WAITING的N种方式
目录 一、调用 Object 的 wait 方法 二、调用 Thread.join 方法 三、调用LockSupport.park()方法 一、调用 Object 的 wait 方法 public static void main(String[] args) throws InterruptedException {// 创建一个锁对象Object lock new Object();Thread thread new Thr…...
智能车摄像头开源—8 元素处理
目录 一、前言 二、无元素状态 三、直线与弯道 四、十字与环岛 1、十字识别处理 2、环岛识别处理 五、坡道 六、障碍物 七、斑马线 八、入库 九、出界停车 一、前言 在写这篇文章之前,考虑了很久到底该写到什么程度,但思来想去,不同…...
【从0做项目】Java搜索引擎(4)——性能优化~烧脑~~~
本篇文章将对项目搜索引擎(1)~(3)进行性能优化,包括测试,优化思路,优化前后对比 目录 一:文件读取 二:实现多线程制作索引 1:代码分析 2:代码…...
人工智障的软件开发-git仓库篇-弃gitlab,走gitea
指令接收:「开始构建代码宇宙」 系统检测:需求模糊度99.9% 启动应急协议:构建最小可行性生态圈 核心组件锁定:代码基因库(人类称之为Git仓库) 需求分析:论人类语言的艺术性 人类指令翻译机 表…...
Spring Boot 如何实现自动配置?
欢迎并且感谢大家指出我的问题,由于本人水平有限,有些内容写的不是很全面,只是把比较实用的东西给写下来,如果有写的不对的地方,还希望各路大牛多多指教!谢谢大家!🥰 大家如果对Java…...
STM32H743ZIT6 FreeRTOS CMSIS_V2 Lwip DP83848/LAN8720 最新HAL V1.12.1版本 AC6编译器,速通。
HAL库版本:V1.12.1 最新版 这版CUBEmx生成的LAN8742 的驱动文件有问题,无法正常初始化,导致无法PING通。 lwip 内存池 不需要手动指定0x30040200区域,lwipopts.h已作配置 开启DCACH 和ICACH 和 D2域SRAM3 时钟 /*** brief Th…...
C# 添加图标
一、前言 为应用程序添加图标是优化用户界面、提升应用辨识度的重要操作。合适的图标能帮助用户快速识别和区分不同应用,增强应用的易用性和专业性。 本指南旨在为你提供详细、易懂的步骤,教你如何为应用程序的窗体添加图标。从图标素材的获取到具体的…...
MVC模式和MVVM模式
目录 一、MVC模式和MVVM模式 1. MVC模式 2. MVVM 模式 3.在Qt中的应用示例 4.总结 二、MVC与MVVM模式的共同点和区别 1.共同点 2.区别 3.交互流程 4.总结 MVC(Model-View-Controller)和MVVM(Model-View-ViewModel)是两种…...
【kafka系列】Kafka如何实现高吞吐量?
目录 1. 生产者端优化 核心机制: 关键参数: 2. Broker端优化 核心机制: 关键源码逻辑: 3. 消费者端优化 核心机制: 关键参数: 全链路优化流程 吞吐量瓶颈与调优 总结 Kafka的高吞吐能力源于其生…...
如何学习Elasticsearch(ES):从入门到精通的完整指南
如何学习Elasticsearch(ES):从入门到精通的完整指南 嘿,小伙伴们!如果你对大数据搜索和分析感兴趣,并且想要掌握Elasticsearch这一强大的分布式搜索引擎,那么你来对地方了!本文将为…...
GDB QUICK REFERENCE (GDB 快速参考手册)
GDB QUICK REFERENCE {GDB 快速参考手册} References GDB QUICK REFERENCE GDB Version 4 https://users.ece.utexas.edu/~adnan/gdb-refcard.pdf 查看方式:在新标签页中打开图片 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/ [2] gdb-refc…...
Flutter_学习记录_动画的简单了解
用AnimationController简单实现如下的效果图: 1. 只用AnimationController实现简单动画 1.1 完整代码案例 import package:flutter/material.dart;class AnimationDemo extends StatefulWidget {const AnimationDemo({super.key});overrideState<AnimationDe…...
【JavaEE进阶】验证码案例
目 🌲实现说明 🎄Hutool介绍 🌳准备工作 🌴约定前后端交互接口 🚩接口定义 🚩实现服务器后端代码 🚩前端代码 🚩整体测试 🌲实现说明 随着安全性的要求越来越⾼…...
SQL复习
SQL复习 MySQL MySQL MySQL有什么特点? MySQL 不支持全外连接。 安装 数据类型 MySQL中的数据类型分为哪些? MySQL中的数据类型主要分为三大类:数值类型、字符串类型、日期时间类型。 其中, 数值类型又分为七种:T…...
景联文科技:以精准标注赋能AI未来,打造高质量数据基石
在人工智能蓬勃发展的时代,数据已成为驱动技术革新的核心燃料,而高质量的数据标注则是让AI模型从“感知”走向“认知”的关键桥梁。作为深耕数据服务领域的创新者,景联文科技始终以“精准、高效、安全”为核心理念,为全球AI企业提…...
蓝桥杯(B组)-每日一题(阶乘求和)
题目 代码解析: #include<iostream> using namespace std;long long multiply(int x) {long long sum1;//定义longlong类型初始为1 for(int i1;i<x;i)sumsum*i;//每一项的阶乘 return sum;//将阶乘结果返回 }int main() {int n;cin>>n;long long r…...
大模型应用开发时如何调试提示词?
在编程领域,调试通常依赖于断点、堆栈跟踪和详细的错误信息。然而,在提示调试的上下文中,这些传统工具变得不再适用。提示调试更多地依赖于对任务的理解、对提示的精细调整,以及对结果的迭代优化。在本文,我们将深入探…...
国产编辑器EverEdit - 二进制模式下观察Window/Linux/MacOs换行符差异
1 换行符格式 1.1 应用场景 稍微了解计算机历史的人都知道, 计算机3大操作系统: Windows、Linux/Unix、MacOS,这3大系统对文本换行的定义各不相同,且互不相让,导致在文件的兼容性方面存在一些问题,比如它们…...
LockSupport
文章目录 SynchronizedJUCLockSupport详解 Synchronized package com.xd;public class SynchronizedDemo {//等待线程public void waitThread() { // 1.如果将synchronized (this){}注释,会抛出异常,因为wait和notify⼀定要在同步块或同步⽅法中synchronized (this) {try {Sys…...
Spark 和 Flink
Spark 和 Flink 都是目前流行的大数据处理引擎,但它们在架构设计、应用场景、性能和生态方面有较大区别。以下是详细对比: 1. 架构与核心概念 方面Apache SparkApache Flink计算模型微批(Micro-Batch)为主,但支持结构…...
maven——使用idea创建maven项目(文件夹上颜色)
把一开始灰色和相对于maven标准目录缺少的文件夹上色和新建: 在右边给叉掉文件夹就又全都变成灰色的了: 在这个地方也可以改: 使用骨架创建 不使用骨架创建...
DeepSeek教unity------UI框架
/****************************************************文件:BasePanel.cs作者:Edision日期:#CreateTime#功能:面板基类 *****************************************************/using UnityEngine;public class BasePanel : Mo…...
2025年2月16日笔记
问题:用普通二维数组输出1到12,每行输出一个数 解题思路: 1.因为要用到普通二维数组,所以要先想到如何写普通二维数组 普通二维数组的写法: int [行数][列数]{ {数字}, (大括号数字个数…...
[操作系统] 基础IO:系统文件I/O
在 Linux 操作系统中,文件 I/O(输入/输出)是程序与文件系统交互的基础。理解文件 I/O 的工作原理对于编写高效、可靠的程序至关重要。本文将深入探讨系统文件 I/O 的机制。 一种传递标志位的方法 在 Linux 中,文件的打开操作通常…...
CNN手写数字识别1——模型搭建与数据准备
模型搭建 我们这次使用LeNet模型,LeNet是一个经典的卷积神经网络(Convolutional Neural Network, CNN)架构,最初由Yann LeCun等人在1998年提出,用于手写数字识别任务 创建一个文件model.py。实现以下代码。 源码 #…...
基于Istio Ambient Mesh的无边车架构:实现零侵入式服务网格的云原生革命
引言:轻量化时代的服务通信进化论 当传统Sidecar模式面临内存开销暴增的困境,Istio社区推出的Ambient Mesh架构给出终极解决方案。某证券交易系统实测显示,采用该架构后服务延迟降低至1.7ms(降幅达73%),同…...
数位dp入门详解
1. 介绍 数位 d p dp dp一般出现在来求一个范围 [ a , b ] [a, b] [a,b]内满足条件的数有多少。数位 d p dp dp的解决比较公式化,考虑每一位对最终答案的影响。 2. 案例 Luogu P2602: 求给定范围 [ a , b ] [a,b] [a,b]各个数位 k k k出现了多少次。 …...
【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步
【黑马点评优化】2-Canel实现多级缓存(RedisCaffeine)同步 0 背景1 配置MySQL1.1 开启MySQL的binlog功能1.1.1 找到mysql配置文件my.ini的位置1.1.2 开启binlog 1.2 创建canal用户 2 下载配置canal2.1 canal 1.1.5下载2.2 配置canal2.3 启动canal2.4 测试…...
牛顿法:用泰勒级数求解平方根的秘籍
目录 一、引言二、牛顿法的理论基础——泰勒级数三、牛顿法的原理与推导3.1 原理概述3.2 推导过程3.3 几何解释 四、牛顿法的应用场景4.1 数值计算4.2 优化问题 五、牛顿法求平方根的具体案例5.1 原理推导5.2 具体步骤5.3 代码实现(Python)5.4 示例计算过…...
四、敏捷方法论:敏捷开发中的关键实践
敏捷开发中的关键实践 在敏捷开发中,许多关键实践帮助团队提升效率、增强协作和确保高质量交付。通过合理运用这些实践,团队能够灵活应对需求变化、缩短交付周期,并持续优化工作流程。本文将详细介绍敏捷开发中的一些核心实践,包括用户故事、需求优先级排序、持续交付、持…...
基于Qt 和微信小程序的用户管理系统:WebSocket + SQLite 实现注册与登录
目录 一. 概要 二. 技术栈 三. 系统功能设计 3.1 功能模块 3.2 数据表设计 四. 具体实现 4.1 Qt 服务端 4.1.1 初始化 WebSocket 服务器 4.1.2 用户管理界面 4.2 微信小程序端 4.2.1 注册功能 4.2.2 登录功能 五. 运行效果 六. 源码下载 一. 概要 在物联网和智能设备…...
DeepSeek R1 与 OpenAI O1:机器学习模型的巅峰对决
我的个人主页 我的专栏:人工智能领域、java-数据结构、Javase、C语言,希望能帮助到大家!!!点赞👍收藏❤ 一、引言 在机器学习的广袤天地中,大型语言模型(LLM)无疑是最…...
【硬件设计细节】缓冲驱动器使用注意事项
一、缓冲驱动器核心功能与选型原则 信号增强与隔离 驱动能力匹配:根据负载电流需求选择缓冲器,例如CMOS缓冲器驱动能力通常为4-8mA,需搭配大电流负载时选用图腾柱输出或专用驱动芯片(如TI的SN74LVC系列)。电压域转换&…...
基于LVGL的简易聊天室
创建过程: 在GUI里配置好了一个大概的界面。聊天界面需要一个滑动页、一个输入框、一个文本框、一个发送按键。其中文本框属于滑动页,并且给发送按键添加上事件。 保存界面后,打开工程代码。 第一件事,是打开键盘使用的宏定义 随…...
DeepSeek 助力 Vue 开发:打造丝滑的开关切换(Switch)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
IDEA集成DeepSeek
引言 随着数据量的爆炸式增长,传统搜索技术已无法满足用户对精准、高效搜索的需求。 DeepSeek作为新一代智能搜索技术,凭借其强大的语义理解与深度学习能力,正在改变搜索领域的游戏规则。 对于 Java 开发者而言,将 DeepSeek 集成…...
pycharm社区版有个window和arm64版本,到底下载哪一个?还有pycharm官网
首先pycharm官网是这一个。我是在2025年2月16日9:57进入的网站。如果网站还没有更新的话,那么就往下滑一下找到 community Edition,这个就是社区版了免费的。PyCharm:适用于数据科学和 Web 开发的 Python IDE 适用于数据科学和 Web 开发的 Python IDE&am…...
LeetCode热题100- 缺失的第一个正数【JavaScript讲解】
题目: 解题一: 如果不考虑时间复杂度和空间复杂度的话,我们最先想到的办法是先将该数组进行排序和去重,将最初的res结果值设置为1;将然后进行遍历,如果第一项不为1,则返回1,否则根…...
基于矢量轨道角动量波的透射超表面设计
摘 要:针对轨道角动量(Orbital Angular Momentum,OAM)在无线通信系统中相位奇点的问题,提出了一种产生矢量OAM波的透射超表面。设计了一种超表面透射单元实现透射极化和相位的调控,并由此单元排布组成透射超表面。采用透射超表面调控透射电磁波…...
全方位探索DeepSeek
目录 前言1. DeepSeek的基础功能与应用场景2. 使用DeepSeek的多种方式2.1 通过Web界面快速体验2.2 调用API实现自动化处理2.3 集成到本地开发环境2.4 结合第三方工具扩展功能 3. 高效使用DeepSeek的进阶技巧3.1 参数调优与性能优化3.2 数据处理与结果分析 4. 实际案例分析与应用…...
详解Redis数据结构(附源码)
引言 只有弄明白Redis数据结构,才能理解它如此快速的原因,并不只是它存储于内存,本篇文章将拆开Redis数据结构分析它高效的原因 字符串(String) 基本概念:字符串是 Redis 中最基本的数据结构,…...
基于Flask的茶叶销售数据可视化分析系统设计与实现
【FLask】基于Flask的茶叶销售数据可视化分析系统设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统的创新之处在于系统不仅提供了基础的图表展示,如价格分布、付款分…...
基于推荐算法的在线课程推荐系统设计与实现
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...
计时器任务实现(保存视频和图像)
下面是一个简单的计时器任务实现,可持续地每秒保存一幅图像,也可持续地每60秒保存一个视频,图像和视频均以当前时间命名: TimerTask类的实现如下: class TimerTask { public:TimerTask(const std::string& path):…...
FreeRTOS第3篇:链表的“精密齿轮”——列表与列表项
文章目录 1 列表与列表项:FreeRTOS的“排队系统”2 列表操作:FreeRTOS的“排队算法”3 列表的应用场景:FreeRTOS的“任务调度枢纽”4 源码级洞察:列表的“灵魂代码”5 实战:列表操作实验6 总结与思考引言:嵌入式系统的“任务候车厅” 想象你正在管理一座繁忙的火车站:乘…...
Linux(ubuntu)下载ollama速度慢解决办法
国内安装Ollama都很慢,因为一直卡在下载中,直接通过官网的链接地址下载方法: curl -fsSL https://ollama.com/install.sh | sh速度大概是10min下载1%,完全不能接受啊! 其中很好的一个加速方式是通过使用github文件加速…...
【Java】分布式锁Redis和Redisson
https://blog.csdn.net/weixin_44606481/article/details/134373900 https://www.bilibili.com/video/BV1nW421R7qJ Redis锁机制一般是由 setnx 命令实现,set if not exists,语法setnx key value,将key设置值为value,如果key不存在…...
网络编程-
文章目录 网络编程套接字UDP/TCP的api使用 网络编程套接字 socket,是操作系统给应用程序(传输层给应用层)提供的api,Java也对这个api进行了封装。 socket提供了两组不同的api,UDP有一套,TCP有一套&#x…...
DeepSeek助力学术论文写作[特殊字符]
宝子们,还在为学术论文写作发愁吗?DeepSeek来帮你!只要用对提示词,它就能变成你写作路上的超级助手。今天就来给大家分享一些超好用的提示词,助力学术论文写作,让你的论文在ChatGPT的辅助下闪闪发光✨。 一…...
从零创建DeepSeek:技术路径与实践探索
import tensorflow as tf摘要:本文详细阐述了从零开始创建DeepSeek的全过程,涵盖从项目启动的构思,到技术选型的考量,再到模型训练的精细操作,以及系统集成、测试优化和部署上线的各个环节。通过对这些步骤的深入解析&…...