Java线程协作wait和notify使用示例

wait_notify_demo 使用Java多线程的wait和notify方法实现最简单的生产者消费者模式 立即下载
介绍
 Object的 wait()和notify()用于线程间协作
 wait()方法
 当在一个对象实例上调用wait()方法后,当前线程就会在这个对象上等待

 notify()
 当object.notify()方法被调用时,就会从这个对象的等待队列中随机选择一个线程,并将其唤醒

 notifyAll()
 唤醒该对象的所有等待线程

 wait()和notify()不能随便调用,必须包含在synchronized语句中,它们都需要先获取目标对象的监视器。
 如果没有在synchronized语句中会报java.lang.IllegalMonitorStateException

 另:
 wait()方法会释放目标对象的锁,而Thread.sleep()方法不会释放目标对象锁


 调用wait()和notify()方法之前需要先获取对象的监视器

Demo

public class WaitAndNotify {
    final static Object object = new Object();
    public static class Test1 extends Thread{
        @Override
        public void run() {
            synchronized (object){
                System.out.println(System.currentTimeMillis()+":Test1 start!");
                try {
                    System.out.println(System.currentTimeMillis()+":Test1 wait for object");
                    object.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(System.currentTimeMillis()+":Test1 end!");
            }
        }
    }


    public static class Test2 extends Thread{
        @Override
        public void run() {
            synchronized(object){
                System.out.println(System.currentTimeMillis()+":Test2 start!notify one thread");
                object.notify();
                System.out.println(System.currentTimeMillis()+":Test2 end!");

                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    public static void main(String[] args) {
        new Test1().start();
        new Test2().start();
    }
}

 结果

1588846940619:Test1 start!
1588846940619:Test1 wait for object
1588846940619:Test2 start!notify one thread
1588846940619:Test2 end!
1588846942620:Test1 end!

实战解析:利用Wireshark解密QQ通信协议 本文提供了一份利用Wireshark工具分析QQ通信协议的实战指南。文章详细介绍了从环境准备、捕获数据包到解析协议层的完整流程,重点演示了如何识别QQ号码字段、观察加密数据特征以及区分不同通信类型(如文本、文件传输)。通过此实践,读者可以深入理解网络分层模型和现代应用加密通信机制,提升网络协议分析与安全诊断能力。 阅读详情

相关推荐

PC网站实现微信扫码登录功能(二)

上篇我们介绍了怎么申请账号以及最后拿到appId和appSecret,如果有不清楚的可以看一下 PC网站实现微信扫码登录功能(一) 下面我就来说一下怎样在PC端怎么实现扫码登录功能。 一、进入官方文档网站 https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html 其实官网对过程描述的已经非常细致了。并且提供了两种扫码方式。一种是跳转二维码扫描页面,另一种是内嵌式二维码。大家可以

qq_35771266的博客 3万+

java Object类wait和notify Demo

import java.util.logging.Level; import java.util.logging.Logger; class Task extends Thread { @Override public void run() { try { synchronized (this) { Thread t = Thread.cu...

weixin_30376509的博客 277

使用R语言获取data.frame中指定列的数据

这里以"df"为例,包含三列数据:“列1”、“列2"和"列3”。通过以上代码,我们成功获取了"列1"和"列3"的数据,并将它们分别存储在了变量"column1"和"column3"中。假设我们有一个名为"df"的data.frame,其中包含了多个列,我们想要提取其中的某一列。符号,我们可以从data.frame中提取出"列2"的数据,并将其赋值给变量"column2"。符号,我们可以轻松提取出data.frame中特定列的数据,并将其存储在变量中供进一步的分析和处理使用。假设我们要获取"列2"的数据。

DevRevolt的博客 2321

JavaDemo——线程协作wait、notify、notifyAll

wait()、notify()、notifyAll()是Object对象的final方法。 必须在拿到锁的情况下使用(同步块中)。 wait(),立即释放锁并进入阻塞。 notify(),只是唤醒一个阻塞线程(如果有多个wait则随机一个)并不立即释放锁,待notify()同步块运行完释放锁,唤醒的线程才可以重新获得锁。 notifyAll(),唤醒所有阻塞线程并不立即释放锁,唤醒的线程由...

FlyLikeButterfly的博客 372

《AgentScope-Java 深入浅出教程》第8章 工具高级特性

掌握工具组、预设参数、执行上下文等高级特性。

步子哥的博客 267

RAG的“诊断艺术”:从测试集结果倒追根源,精准优化检索、排序与生成

当RAG应用给出一个糟糕的答案时,开发者的第一反应可能是:“我的Prompt写得不够好?”这种基于“感觉”的猜测往往是低效的。通过构建一个包含黄金上下文信息的测试集,我们可以像一位经验丰富的医生一样,对RAG系统的各个“器官”进行独立的“健康检查”。一个用于RAG诊断的测试集,除了问题和答案,还需要包含中间环节的“黄金标准”。如果你的RAG流程包含Re-ranker,那么在评估完初期的召回后,需要单独评估Re-ranker的效果。RAG的优化是一个持续的过程,应该形成一个闭环。的文档块尽可能多地召回。

kakaZhui的博客 154

wait() 和notify() 怎么使用 6个demo诠释它+3个demoZH

demo1: package com.jvm.others.thread; /**测试Wait和notify的搭配使用 * @author pc * */ public class WaitAndNotify { public static void main(String[] args) throws Exception { Thread thread1 = new Thread(new...

qq_29499107的博客 676

ROM和RAM在单片机程序运行理解

ROM和RAM是电子设备中两种核心存储组件,主要区别在于:ROM用于长期存储系统程序、用户文件等固定数据,断电后数据不丢失,但写入速度较慢;RAM则用于临时存储运行中的程序和数据,读写速度快但断电后数据会清空。在单片机中,ROM存储程序代码和常量,RAM存储运行时的变量和数据。两者协同工作,ROM如同"永久档案库"保存必要信息,RAM则像"临时工作台"支持高速运算,共同确保设备正常运行。

qq_37999850的博客 1624

【Java|多线程与高并发】wait和notify方法详解

在Java多线程环境中,线程之间是抢占式执行的,线程的调度是随机的.这就很难受了. 在很多情况下我们希望线程以我们想要的顺序来执行. 这就需要wait和notify这两个方法wait和notify方法用于实现线程间的协作和通信.wait方法使线程进入等待状态,notify方法唤醒一个等待线程,notifyAll方法唤醒所有等待线程。通过上述三个方法,可以使线程按照特定的顺序执行或者等待某个条件满足后再执行。希望这篇文章能帮到你!专栏:《从零开始的Java学习之旅》在不断更新中,欢迎订阅!

云泽野の编程日记 1777

AutoSAR MemMap模块详解及使用注意事项

在本文中,我们将深入探讨MemMap模块的实例解析,并介绍在使用该模块时需要注意的一些事项。在上述代码中,我们使用了MEMMAP_START_SEC_VAR_32BIT和MEMMAP_START_SEC_CODE来定义MemMap区域的起始位置,使用MEMMAP_STOP_SEC_VAR_32BIT和MEMMAP_STOP_SEC_CODE来定义MemMap区域的结束位置。1.合理划分MemMap区域:根据实际需求,合理划分MemMap区域,将不同类型的变量放置在不同的区域中,以便于管理和访问。

weixin_50547796的博客 2534

让 ME51N 在采购信息记录过期时不要带出上一次采购订单的价格

在采购信息记录(PIR)价格条件无效或过期时,到上一次采购订单价格进行提议;你可以通过关闭,并在把PO price设置为不采纳,再辅以把过期的价格来源直接拦截为错误。若仍需 100% 阻断,可用在保存前清空估价价格作为技术兜底。标准行为与配置证据见文内引用。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 665

Java的wait和notify学习三部曲之一:JVM源码分析

sleep(100);以上就是本次实战用到的demo,代码功能简述如下:启动线程A,取得锁之后先启动线程B再执行wait()方法,释放锁并等待;线程B启动之后会等待锁,A线程执行wait()之后,线程B取得锁,然后启动线程C,再执行notify唤醒线程A,最后退出synchronize代码块,释放锁;线程C启动之后就一直在等待锁,这时候线程B还没有退出synchronize代码块,锁还在线程B手里;

2401_83620690的博客 735

使用 FastAPI 和 LangGraph 构建生产级智能体 AI 系统

这是一本关于使用 FastAPI 和 LangGraph 构建生产级智能体 AI 系统的详细书籍,全文约 10 万字。《Production-Grade Agentic AI System Design and Implementation: Building Agentic AI Systems Using FastAPI and LangGraph》随着人工智能(AI)技术的迅猛发展,智能体(Agent)作为能够自主感知、推理、决策和行动的实体,正逐渐成为构建复杂智能系统的核心。从个性化推荐、客户服务到

AI天才研究院 353

Java线程间协作的两种方式:wait、notify、notifyAll和Condition

原文地址:https://www.cnblogs.com/dolphin0520/p/3920385.html 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队...

学习笔记 558

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java并发编程—线程间协作方式wait()、notify()、notifyAll()和Condition

原文作者:Matrix海 子 原文地址:Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition 目录 一.wait()、notify()和notifyAll() 二.Condition 三.生产者-消费者模型的实现 在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消.

sanmi8276的博客 291

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

原文 Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去。因此,一般情况下,当队列满时,会让生产者交出对临界资

ss810540895的博客 267

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java线程间协作之等待与通知:wait、notify和notifyAll

在 Java 多线程编程中,wait、notify 和 notifyAll 是用于线程间通信的重要方法。它们是在 Object 类中定义的,因此每个 Java 对象都可以使用这些方法。本文将通过一个实际应用场景来介绍它们的使用。

老徐的博客只有干货 493

JAVA多线程基础篇 7、线程协作 wait()和notify()

wait和nofity是成对使用的,最好使用notifyAll(),这样可以唤起这条队列里所有的线程, 同时还需要注意的是,wait和while需要配对使用。

EndlessProcess的专栏 779

Java用wait和notify实现线程协作

编写一个应用程序,除了主线程外,还有两个子线程。两个子线程对同一个数据操作,其中一个线程负责对该数据做递增操作,一个线程负责对该线程做递减操作。当这个数据小于0的话,递减操作等待,当这个数据大于100的话,递增操作等待。

Super_Wang 1038

java多线程协作object.notify和object.wait

最近学习java多线程协作,发现网上很多文章写得不清晰,甚至是错误的。所以自己研究了一下多线程协作的写法,通过例子进行说明:三个线程,A线程输出6遍A,B线程输出6遍B,C线程输出6遍C,要求按照ABC的顺序轮流唤醒进行输出。做了两种实现。   第一种实现:   public class Printer implements Runnable { private String ...

思念如织 196

Java并发编程:线程间协作的两种方式:wait、notify和Condition

在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需 要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放 对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去。因此,一般情况 下,当队列满时,

chinoukin的博客 319

java多线程之wait_java多线程之wait和notify协作,生产者和消费者

这篇直接贴代码了package cn.javaBase.study_thread1;class Source {public static int num = 0; //假设这是馒头的数量}class Producer implements Runnable {private Object obj;public Producer(Object obj) {this.obj = obj;}@Over...

weixin_33816175的博客 201
上一篇: MySQL 8 'this authentication plugin is not supported'问题处理
下一篇: Java线程协作join使用
思维的深度
博客等级 码龄11年 2万+粉丝 391原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值