JavaEE: wait和notify

article/2025/8/4 17:23:11

wait和notify(都需要搭配synchronized使用)

  join(),哪个线程调用这个方法,哪个线程就堵塞

  wait和notify都是Object的方法,随便定义一个对象都可以使用

wait、sleep、join的区别:

wait:需要搭配synchronized使用,线程wait处于WAITING状态;需要其它线程notify唤醒;也可设置时间到点唤醒

sleep:到时间才能被苏醒,也可以被interrupt中止,但会抛异常,非常规

join:谁调用join,当前线程就得停下来,等待调用join方法的这个线程执行完全部才可以执行;也可设置参数,到时间就可以不等了。

wait():

执行之前要做三件事:

1.释放当前的锁

2.让线程进入阻塞状态

3.当线程被唤醒的时候,重新获取到锁。

//wait()
public class Demo22 {public static void main(String[] args) throws InterruptedException {
//        Object object = new Object();
//        System.out.println("wait之前:");
//        object.wait();//释放锁的前提是得有锁,不然会产生不合法监视器状态异常
//        System.out.println("wait之后: ");Object object = new Object();System.out.println("wait之前:");synchronized(object) {object.wait();//把 wait 要放到 synchronized 里面来调用. 保证确实是拿到锁了的.//wait() 先释放锁,再让线程进入阻塞状态,最后等待唤醒重新获取到锁}System.out.println("wait之后: ");}
}

wait和notify():可以用来避免"线程饿死"

wait的使用必须是当前对象被上锁之后才能使用(没上锁的话就不知道在wait谁了)

线程wait之后,必须要有其它线程notify来唤醒这个线程,不然会一直堵塞。

1.没有上锁的wait

2.没有其它线程来notify正在wait的线程

3.两个线程,一个wait,一个用notify来唤醒正在wait的线程

package thread;public class Demo23 {public static void main(String[] args) {Object object = new Object();Thread t1 = new Thread(() -> {synchronized (object) {System.out.println("wait之前:");try {object.wait();//可以添加等待的时间,不会死等,超过等待时间就会去掉wait,继续向下执行} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println("wait之后: ");});Thread t2 = new Thread(() -> {try {Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (object) {//可重复锁System.out.println("t2进行通知之前:");object.notify();
//唤醒,如果有多个线程需要唤醒,可以用notifyAll(),
//不过notify更为可控,唤醒之后,各个线程重新获取锁的过程是串行执行的、System.out.println("t2进行通知之后:");}});t1.start();t2.start();}
}

注意:释放wait的notify的锁对象要和wait的锁对象一样,不然不能释放,不能唤醒。

在系统中,notify可以不用上锁;

但在java中,规定要上锁。上锁对象和notify对象要一致,和系统有区别。

上述代码解析:

1. 因为t2睡了3秒,所以t1线程先执行,打印“wait之前”,然后t1线程堵塞等待。

2. t2睡了3秒之后,获得locker锁,打印“t2进行通知之前:”;

    当t2线程执行notify之后,t1线程wait释放

3. t2还持有锁,t1还在阻塞,打印“t2进行通知之后”,释放锁

4. t1拿到锁,打印“wait之后”


http://www.hkcw.cn/article/PgYtqAMSGa.shtml

相关文章

6.运算放大器—电源抑制比(五)

运放的电源抑制比(PSRR, Power Supply Rejection Ratio)是衡量其抑制电源电压波动对输出信号影响能力的重要参数。 1、PSRR定义 PSRR表示运放对电源电压变化的抑制能力,定义为: 或者 PSRR值越高,运放对电源噪声的抑制能…

【Linux网络编程】数据链路层

目录 认识以太网 以太网帧格式 认识MAC地址 认识MTU MTU对IP协议的影响 MTU对UDP协议的影响 MTU对TCP协议的影响 ARP协议 ARP协议的作用 ARP数据包的格式 ARP协议的工作流程 认识以太网 "以太网"不是一种具体的网络,而是一种技术标准&#xff1…

【BootLoader】之stm32F407实现bootloader相关问题

前言 主要是在使用f407时遇见的一些问题记录;环境是STM32F407、rt_thread 1. 乱码问题 修改system_stm32f7xx.c ,stm32f4xx_hal_conf_template.h 时钟频率 #define HSE_VALUE 8000000U 解决问题 2. 忘记了是啥问题 3. bootloader跳转失败 解决方法&a…

WSL 安装 Debian 12 后,Linux 如何安装 curl , quickjs ?

在 WSL 的 Debian 12 系统中安装 curl 非常简单,你可以直接使用 APT 包管理器从官方仓库安装。以下是详细步骤: 1. 更新软件包索引 首先确保系统的包索引是最新的: sudo apt update2. 安装 curl 执行以下命令安装 curl: sudo…

数据中台(大数据平台)之数据安全管理

数据安全管理是结合大数据技术和行业特性,数据中台产品应具备数据分类分级、敏感数据智能识别的功能,并结合敏感数据管理、数据脱敏、数据加密等安全管控方式,保障数据安全可用。 1.安全分级分类:数据分级分类是一种将不同数据按…

Linux防火墙:全面解析IPTables的表、链、规则!

iptables 防火墙用于管理包过滤和 NAT 规则。IPTables 随所有 Linux 发行版一起提供。了解如何设置和配置 iptables 将帮助您有效地管理 Linux 防火墙。 iptables 工具用于管理 Linux 防火墙规则。乍一看,iptables 可能看起来很复杂(甚至令人困惑&#…

【火山引擎 大模型批量处理数据教程-详细】

相关的文档 !!先注册账号第一步!! 批量处理文档费用接口对象存储地址提交批量处理网页 1. 准备jsonl数据集 官网网页地址样例,需要根据你自己的数据进行需改 import jsonsystem_prompt """ 你的任…

设计模式——代理设计模式(结构型)

摘要 本文详细介绍了代理设计模式,包括其定义、结构组成、实现方式、适用场景及实战示例。代理设计模式是一种结构型设计模式,通过代理对象控制对目标对象的访问,可增强功能或延迟加载等。文中通过类图、时序图、静态代理、JDK动态代理、CGL…

API网关性能测试与瓶颈定位:微服务世界的守门人之道

在现代微服务架构中,API网关(API Gateway)是所有外部请求进入系统的第一道关口,是服务路由、协议转换、安全认证、流量管控、熔断限流等功能的集中体现。它既是安全屏障,又是性能瓶颈的高发区。 性能测试中&#xff0c…

Vehicle HAL(2)--Vehicle HAL 的启动

目录 1. VehicleService-main 函数分析 2. 构建EmulatedVehicleHal 2.1 EmulatedVehicleHal::EmulatedVehicleHal(xxx) 2.2 EmulatedVehicleHal::initStaticConfig() 2.3 EmulatedVehicleHal::onPropertyValue() 3. 构建VehicleEmulator 4. 构建VehicleHalManager (1)初…

【科研绘图系列】R语言绘制论文组合图形(multiple plots)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图1画图2画图3画图4画图5系统信息介绍 这篇文章详细介绍了如何使用R语言进行科研绘图,特别是绘制论文组合图形(multiple plots)。文章从数…

设计模式——命令设计模式(行为型)

摘要 本文介绍了命令设计模式,这是一种行为型设计模式,用于将请求封装为对象,实现请求的解耦和灵活控制。它包含命令接口、具体命令、接收者、调用者和客户端等角色,优点是解耦请求发送者与接收者,支持命令的排队、记…

用提示词写程序(3),VSCODE+Claude3.5+deepseek开发edge扩展插件V2

edge扩展插件;筛选书签,跳转搜索,设置背景 链接: https://pan.baidu.com/s/1nfnwQXCkePRnRh5ltFyfag?pwd86se 提取码: 86se 导入解压的扩展文件夹: 导入扩展成功: edge扩展插件;筛选书签,跳转搜索,设置背景

一周学会Pandas2之Python数据处理与分析-Pandas2数据分组与聚合

锋哥原创的Pandas2 Python数据处理与分析 视频教程: 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili Pandas 的分组与聚合功能是数据分析的核心工具,允许你根据特定条件分割数据,然后对每个子集应…

零基础上手 Cherry Studio:打造专属 AI 助手的第一步

名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、Cherry Studio是什么?为什么选择它?1.Cherry Studio简介…

API平台(API网关)之API编排

支持WEB可视化的API编排能力,内置基本组件、流程控制、报文转换以及其他类型的组件,通过可视化拖、拉、拽对API进行编排和调度,支持Restful API、WebService、JAVA等多协议转换混合编排和API服务聚合能力,满足复杂业务场景的API支…

初识PS(Photoshop)

初识PS(Photoshop) 1、Photoshop界面 2、常用快捷键

鸿蒙ArkTS | Badge 信息标记组件自学指南

在做 UI 设计时,我们经常会碰到这样一个需求:要在某个图标、按钮或列表项的角落加一个小小的提示,比如红点、新消息数量、状态标签之类的。这时候就轮到 ​​Badge​​ 组件登场了。 如果你想要一个简单优雅、可配置灵活的信息标记功能&…

【C++】cin和cout的性能问题讨论和优化方法

目录 1、背景知识2、ios::sync_with_stdio(false)2.1 **作用**2.2 原理2.3 注意事项 3、cin.tie(0)3.1 作用3.2 原理3.3 注意事项 4、代码演示5、实例操作5.1 创建数据文件5.2 进行代码演示 个人主页<—请点击 C专栏<—请点击 1、背景知识 在 C 中&#xff0c;标准输⼊输…

【数据结构】图的存储(十字链表)

弧节点 tailvex数据域&#xff1a;存储弧尾一端顶点在顺序表中的位置下标&#xff1b;headvex 数据域&#xff1a;存储弧头一端顶点在顺序表中的位置下标&#xff1b;hlink 指针域&#xff1a;指向下一个以当前顶点作为弧头的弧&#xff1b;tlink 指针域&#xff1a;指向下一个…