生产者消费者Condition实现

【JAVA】38. Condition条件队列实现生产者 - 消费者模型 在 Java 中,Condition接口是 Java 并发包中的一个重要接口,它为线程提供了一种更灵活的等待/通知机制,与Object类的wait()notify()和方法类似,但功能更强大。Condition实例是由Lock实例创建的,一个Lock可以创建多个Condition实例,每个Condition实例都有自己的等待队列。 阅读详情

生产者消费者Condition实现:

import java.util.PriorityQueue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @Author dfpeng
 * @Date 2019/7/8
 */
public class ProducerConsumer {
    private int queueSize=10;
    private PriorityQueue<Integer> queue=new PriorityQueue<>(queueSize);
    private Lock lock=new ReentrantLock();
    private Condition notFull=lock.newCondition();
    private Condition notEmpty=lock.newCondition();

    public static void main(String[] args) throws InterruptedException {
        ProducerConsumer pc=new ProducerConsumer();
        Producer p=pc.new Producer();
        Consumer c=pc.new Consumer();
        p.start();
        c.start();
        Thread.sleep(0);
        p.interrupt();
        c.interrupt();
    }

    class Consumer extends Thread{
        @Override
        public void run() {
            consume();
        }

        volatile boolean flag=true;
        private void consume(){
            while (flag){
                lock.lock();
                try {
                    while (queue.isEmpty()){
                        try {
                            System.out.println("队列空,等待数据");
                            //等待队列不为空
                            notEmpty.await();
                        } catch (InterruptedException e) {
//                            e.printStackTrace();
                            flag=false;
                        }
                    }
                    //每次移走队首元素
                    queue.poll();
                    notFull.signal();
                    System.out.println("从队列取走一个元素,队列剩余"+queue.size()+"个元素");
                }finally {
                    lock.unlock();
                }
            }
        }
    }

    class Producer extends Thread{
        @Override
        public void run() {
            produce();
        }

        volatile boolean flag=true;
        private void produce(){
            while (flag){
                lock.lock();
                try {
                    while (queue.size()==queueSize){
                        try {
                            System.out.println("队列满,等待有剩余空间");
                            notFull.await();
                        } catch (InterruptedException e) {
//                            e.printStackTrace();
                            flag=false;
                        }
                    }
                    queue.offer(1);
                    notEmpty.signal();
                    System.out.println("向队列中插入一个元素,队列剩余空间:"+(queueSize-queue.size()));
                }finally {
                    lock.unlock();
                }
            }
        }
    }
}

运行结果:

向队列中插入一个元素,队列剩余空间:9
向队列中插入一个元素,队列剩余空间:8
向队列中插入一个元素,队列剩余空间:7
向队列中插入一个元素,队列剩余空间:6
向队列中插入一个元素,队列剩余空间:5
向队列中插入一个元素,队列剩余空间:4
向队列中插入一个元素,队列剩余空间:3
向队列中插入一个元素,队列剩余空间:2
向队列中插入一个元素,队列剩余空间:1
向队列中插入一个元素,队列剩余空间:0
队列满,等待有剩余空间
队列满,等待有剩余空间
从队列取走一个元素,队列剩余9个元素
从队列取走一个元素,队列剩余8个元素
从队列取走一个元素,队列剩余7个元素
从队列取走一个元素,队列剩余6个元素
从队列取走一个元素,队列剩余5个元素
从队列取走一个元素,队列剩余4个元素
从队列取走一个元素,队列剩余3个元素
从队列取走一个元素,队列剩余2个元素
从队列取走一个元素,队列剩余1个元素
从队列取走一个元素,队列剩余0个元素
队列空,等待数据
队列空,等待数据
向队列中插入一个元素,队列剩余空间:9
从队列取走一个元素,队列剩余0个元素

Process finished with exit code 0

欢迎关注我的微信公众号,接收最新动态。

生产者-消费者(lock和condition).zip 通过java语言编写的生产者消费者,实现方法为lock类和condition类的配合完成。 立即下载

相关推荐

还讲生产者与消费者(condition)

NULL 博文链接:https://xylong.iteye.com/blog/1515006

生产者消费者模式

而此时,如果生产者生产了一个数据,便会唤醒两个消费者线程,而两个线程中只有一个线程可以拿到锁,并执行 queue.remove 操作,另外一个线程因为没有拿到锁而卡在被唤醒的地方,而第一个线程执行完操作后会在 finally 中通过 unlock 解锁,而此时第二个线程便可以拿到被第一个线程释放的锁,继续执行操作,也会去调用 queue.remove 操作,然而这个时候队列已经为空了,所以会抛出。生产者负责生产数据,消费者负责处理数据,通过合理的协作,可以实现高效的数据处理。如何才能让大家更好地配合呢?

- 1324

Sentence-BERT 语义相似度双塔模型

论文介绍 发表:2019,EMNLP 论文题目:《Sentence-BERT:sentence embeddings using siaese BERT-networks》 论文地址:https://arxiv.org/abs/1908.10084 Github:https://github.com/UKPLab/sentence-transformers 适用领域: 句向量生成 语义相似度计算 语义搜索 无监督任务(聚类) 1 概述 在20年之前的各种预训练模型中,比如bert,XLNet,Alb

weiyaner的博客 9193

02-生产者消费者问题&condition 实现精准唤醒,三分钟带你入门redis高可用架构之哨兵模式

i < 10;i++) {try {//等待 业务 通知//+1if(number!=0){//等待number++;//通知//-1number–;//通知问题 : 如果4个线程呢?A B C D 虚假唤醒if 改为 while 就行了=0){//等待number++;//通知5.JUC 生产者和消费者问题代码实现i < 10;

ccc6553584的博客 404

【低空经济】森林火情高精度监测与早期预警无人机巡护方案

在全球范围内,森林火灾已成为一个严重的生态和社会问题。它不仅对自然生态系统造成了毁灭性的影响,还对人类的生命财产安全构成了极大的威胁。根据国际森林发展组织的统计,全球每年因森林火灾造成的经济损失高达数百亿美元,甚至在某些年份,火灾损失占到某些国家国民经济总量的相当一部分。因此,开展高效的森林火情监测与早期预警工作显得尤为重要。随着科技的发展,无人机作为新兴的监测工具,以其高效、灵活和经济的特点在森林火灾监测领域展现出了巨大的潜力。

2502_92579126的博客 1212

从摄像头选型到PCB布线:搞懂MIPI CSI带宽计算,避免你的嵌入式项目翻车

本文详细解析了MIPI CSI带宽计算在嵌入式项目中的关键作用,从摄像头选型到PCB布线提供全流程指导。通过实际案例和计算公式,帮助工程师准确计算带宽需求,避免图像丢帧和系统崩溃问题,同时优化PCB设计确保信号完整性。

weixin_30533109的博客 376

condition实现生产者和消费者

生产者 import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; public class ConditionProducer implements Runnable { private Lock lock; private Condition condition; p

Emine 1431

CAN XL和10Base-T1S全对比:在区域架构中如何选择最适合的车载通信协议?

本文深入对比了CAN XL和10Base-T1S在车载网络架构中的性能差异,通过实测数据和典型应用场景分析,为区域架构设计提供选型指南。重点探讨了带宽、延迟、成本等关键指标,帮助工程师在ADAS传感器部署和车身控制网络优化中做出明智选择。

pear55的博客 594

并发编程学习之生产者消费者模式 - 使用Condition实现

一、简介 上一篇我们介绍了使用传统的synchronized结合wait()/notifyAll()线程通信机制实现了生产者消费者案例,并且介绍了多线程交互中常见的虚假唤醒现象。我们都知道,Lock同步锁其实可以代替synchronized完成同步功能,并且使用起来还没有那么复杂,本文将介绍如何使用Lock实现生产者消费者案例。 下表是synchronized和Lock实现线程通信方法的区别:...

weixiaohuai的博客 1044

注意力机制篇 | YOLOv8改进之在C2f模块添加EMA注意力机制(附2种改进方法)

EMA(Exponential Moving Average)注意力机制是一种用于增强模型性能的注意力机制,它通过对模型的特征图进行加权平均来提取更有用的特征信息。具体来说,EMA注意力机制通过引入一个权重因子来调整特征图中每个位置的重要性,从而使模型能够更好地关注重要的特征。🌈

小哥谈 4180

SolidWorks速成教程P1——简介及基础操作

SolidWorks教程P1——简介及基础操作

嵌入式阿齐Archie 2万+

Java多线程(八)生产者消费者——Condition和精准唤醒

Java多线程(七)生产者消费者——Condition和精准唤醒 Java多线程(七)生产者消费者——Condition和精准唤醒什么是ConditionCondition解决生产者消费者问题Condition 精准唤醒Condition 实现分析等待队列等待唤醒 什么是Condition 对于任意一个java对象,它都拥有一组定义在java.lang.Object上监视器方法,包括wait(),wait(long timeout),notify(),notifyAll(),这些方法配合synchron

lizefeng1998的博客 634

YOLOv11魔改高效涨点 | 注意力篇 | SimAM注意力:基于神经科学的 3D 注意力机制,三维权重的暴力美学,无参数也能暴力涨点?代码极简,彻底疯狂!!!

在本文中,我们为卷积神经网络(ConvNets)提出了一个概念简单但非常有效的注意力模块。与现有的通道注意力(Channel-wise)和空间注意力(Spatial-wise)模块不同,我们的模块在不向原始网络添加参数的情况下,推断出层中特征图的 3D 注意力权重。具体来说,我们基于一些知名的神经科学理论,提出优化一个能量函数来寻找每个神经元的重要性。我们进一步推导出了该能量函数的快速闭式解,并表明该解可以用不到十行代码实现。

猫天意的博客 248

生产者消费者(Condition实现)

System.out.println(Thread.currentThread().getName() + " 进入阻塞");System.out.println(Thread.currentThread().getName() + " 被唤醒");System.out.println(Thread.currentThread().getName() + " 开始工作");System.out.println(Thread.currentThread().getName() + " 完成工作");

zhanghui_10000的专栏 475

基于工作流的低代码AI应用开发:Flock平台核心架构与实战指南

在AI应用开发领域,工作流编排正成为连接大语言模型(LLM)能力与复杂业务逻辑的关键技术。其核心原理是将任务分解为模块化节点,通过可视化方式定义执行顺序与数据流向,从而实现灵活可控的自动化流程。这种范式极大地提升了开发效率,降低了技术门槛,使得开发者能够聚焦于业务设计而非底层代码。在技术价值层面,工作流编排支持检索增强生成(RAG)、多智能体协作等高级模式,并能通过人工干预节点确保关键流程的可靠性与合规性。其典型应用场景包括智能客服、自动化办公、数据分析助手等。本文以Flock平台为例,深入解析了如何利用其

weixin_26848497的博客 381

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Condition实现生产者消费者模型

import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @author...

shy_black的博客 400

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

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

使用Condition实现生产者消费者

使用Condtion实现生产者消费者可以精确控制唤醒生产者还是消费者线程 与synchronized的等待唤醒机制相比Condition具有更多的灵活性以及精确性,这是因为notify()在唤醒线程时是随机(同一个锁),而Condition则可通过多个Condition实例对象建立更加精细的线程控制,也就带来了更多灵活性了,我们可以简单理解为以下两点 通过Condition能够精细的控制多...

大灰狼的专栏 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Condition实现生产者消费者小demo

如果说重入锁ReentrantLock的lock()与unlock()方法的作用和synchronized的作用类似,那么Condition的await(),signal(),signalAll()作用就是和Object.await(),Object.notify(),Object.notifyAll()类似: import java.util.concurrent.locks.Conditi...

欣淡定的博客 622

使用Condition实现生产者消费者模型

import java.util.Optional; import java.util.Random; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class ProducerConsumer2 { public static v...

weixin_45001323的博客 235

用Condition条件变量实现生产者消费者模式

import java.util.LinkedList; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class ProducerConsumerPattern{ public static final int MAX_CAP = 20;

Just Do IT 2472

Java 使用Condition实现 生产者/消费者模式

一对一交替打印: package org.test.t8.t_3; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class MyService { private ReentrantLock lock = new Reentrant...

抛弃幻想,准备斗争 1721

Chapter 6 生产者消费者之Condition实现

1 背景 在上一篇blog:Chapter 5 生产者消费者系列之传统实现中介绍了一下传统方式实现生产者消费者的原理。通过wait/notifyAll的方式,实现多个生产者和消费者线程之间的通信,然而这种方式比较“浅层”,会造成资源上的浪费。通过Condtion对象,能更有针对性的唤醒线程。具体的方式是,在同一把锁上绑定两个Condition对象,分别对应生产者和消费者,唤醒时通过Condi

skuxeqrsjnxdo596的博客 395

C++ condition_variable 实现生产者消费者模型

这里写自定义目录标题C++ condition_variable 实现生产者消费者模型 C++ condition_variable 实现生产者消费者模型 #include <iostream> #include <thread> #include <condition_variable> #include <mutex> #include <queue> #include<windows.h> #include<chrono&g

q1076452761的博客 573

使用Lock的Condition实现生产者消费者

使用Lock的Condition实现生产者消费者

chenjy074的博客 347

Java生产者消费者condition实现

import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class BlockingQueue { public

J-Proton博客 1041

使用ReentrantLock和Condition实现生产者消费者

package mashibing; /** * 生产者消费者 */ import java.util.LinkedList; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java...

weiboKDhuo的博客 288
上一篇: Redis持久化RDB和AOF
下一篇: MySQL秋招复习
pdfcxc
博客等级 码龄10年 23粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值