ReentrantLock和Condition 实现生产者 运输者 消费者

基于Simulink的电动汽车电池管理系统热管理优化仿真 电动汽车电池管理系统(Battery Management System, BMS)中的热管理是确保电池性能、安全性和寿命的关键环节。温度过高或过低都会显著影响电池的工作效率和寿命,因此需要对电池组进行精确的热管理。基于MATLAB/Simulink的仿真平台可以用于建模和优化电池热管理系统,包括热分布预测、冷却策略设计以及热平衡控制等。本项目旨在构建一个完整的电动汽车电池热管理优化仿真模型,并通过仿真验证系统的性能。 阅读详情

生产者、运输者、消费者 三个线程协作

使用公平锁实现,
Condition 条件限制。

/**
 * 三个线程,一个生产商 A 一个中间商B  一个消费者C
 * 生产商 每次生产1个商品
 * 中间商每次运送 2个商品 ,消费者每次消费3个商品
 * 如果梳理不满足 则不运送 不消费
 */
public class ThreePersionLockCondition {

    private final static ReentrantLock lock = new ReentrantLock(true);

    private static Condition condition = lock.newCondition();
    private static Condition condition1 = lock.newCondition();

    private static Queue<String> queue = new ArrayDeque<>();
    private static Queue<String> queue2 = new ArrayDeque<>();

    public static void main(String[] args) throws InterruptedException {

        ExecutorService executorService = Executors.newFixedThreadPool(9);
        Runnable target;
        Thread a = new Thread(new Produce(lock, queue, condition));
        a.start();

        executorService.submit(new Produce(lock, queue, condition));
        executorService.submit(new Middleman(lock, queue, queue2, condition));
        executorService.execute(new Consumer(lock, queue2, condition));


        executorService.shutdown();
        executorService.awaitTermination(60, TimeUnit.SECONDS);
    }
}

/**
 * 生产者
 */
class Produce implements Runnable {

    Lock lock;
    Queue<String> queue;
    Condition condition;

    public Produce(Lock lock, Queue<String> queue, Condition condition) {
        this.lock = lock;
        this.queue = queue;
        this.condition = condition;
    }

    @Override
    public void run() {
        while (true) {
            lock.lock();
            try {
                while (queue.size() < 2) {
                    queue.add("1");
                    System.out.println("生产1个产品");
                    Thread.sleep(1000);
                    System.out.println("----生产队列剩余:" + queue.size());
                    condition.signal();
                }
                condition.await();
            } catch (final Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }

        }
    }
}

/**
 * 中间商
 */
class Middleman implements Runnable {

    Lock lock;
    Queue<String> queue;
    Queue<String> queue2;
    Condition condition;


    public Middleman(Lock lock, Queue<String> queue, Queue<String> queue2, Condition condition) {
        this.lock = lock;
        this.queue = queue;
        this.queue2 = queue2;
        this.condition = condition;
    }

    @Override
    public void run() {
        while (true) {
            lock.lock();
            try {
                while (queue.size() > 1) {
                    System.out.println("运输2个产品");
                    String a = queue.poll();
                    String b = queue.poll();
                    queue2.add(a);
                    queue2.add(b);
                    condition.signalAll();

                }
                condition.await();


            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    }
}

/**
 * 消费者
 */
class Consumer implements Runnable {

    Lock lock;
    Queue<String> queue2;
    Condition condition;

    public Consumer(Lock lock, Queue<String> queue2, Condition condition) {
        this.lock = lock;
        this.queue2 = queue2;
        this.condition = condition;
    }

    @Override
    public void run() {
        while (true) {
            lock.lock();
            try {
                while (queue2.size() > 2) {
                    for (int i = 0; i < 3; i++) {
                        System.out.println("消费产品:" + queue2.poll());
                    }
                    System.out.println("消费完成3个产品");
                    System.out.println("-----------消费队列剩余:" + queue2.size());
                    condition.signal();
                }
                condition.await();

            } catch (Exception e) {
            } finally {
                lock.unlock();
            }
        }
    }

}
2024年全国青少年信息素养大赛复赛真题(算法创意实践挑战赛C++试卷:带解析) 阅读详情

相关推荐

ACS驱动器直线电机回零程序与误差补偿Buffer实战解析

本文深入解析了ACS驱动器控制直线电机时,实现高精度回零与误差补偿的完整实战流程。核心在于利用驱动器的D-Buffer功能,将激光干涉仪测量的误差数据导入补偿数组,通过ERRORMAP1D指令进行映射,从而实时修正定位误差,显著提升设备重复定位精度。文章详细拆解了回零程序逻辑、补偿参数设置及关键调试避坑指南。

646

使用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的博客 287

Meta开源Ego-Exo4D数据集:如何用1400小时多模态视频训练你的AI模型

Meta开源的Ego-Exo4D数据集包含1400小时多模态视频,涵盖第一人称和第三人称视角、眼动追踪、IMU传感器等多种模态,是AI模型训练的宝贵资源。本文详细介绍了从数据集下载、预处理到模型训练的全流程,帮助研究者高效利用这一多模态数据集进行AI模型开发。

weixin_29159441的博客 342

JAVA(五)ReentrantLock(重入锁)+Condition 生产者消费者模型

重点:ReentrantLock+Condition,await、signal方法 VS synchronized+Object的wait、notify 1. ReentrantLock对比snchronized ReentrantLock支持公平锁和非公平锁、可中断。 // 非公平锁(默认) final ReentrantLock lock = new ReentrantLock();...

muer_123的博客 545

自旋玻璃(spin glass)、自旋冰(spin ice)和量子自旋液体(quantum spin liquid)(之二)

具有相同电荷的电子相互排斥。结果,为了在极其拥挤的环境中相互超越,他们不得不改变自己的行为。剑桥大学和英国伯明翰大学于 2009 年 7 月发表的研究表明,电子可以通过量子隧穿从金属表面跳到相近位置的量子线上,这样做后,将分离成两个准粒子,命名为的自旋子和全子。Van den Brink、Khomskii 和 Sawatzky 在 1997-1998 年对轨道子进行了理论上的预测。在 2011 年 9 月发给出版商的论文中报告了它作为一个单独的准粒子的实验观察结果。

qq_32515081的博客 1万+

ZYNQ学习:PL端DDR3 读写测试

DDR SDRAM 的最大特点是双沿触发,即在时钟的上升沿和下降沿都能进行数据采集和发送,同样的工作时钟, DDR SDRAM 的读写速度可以比传统的 SDRAM 快一倍。本次实验使用的 DDR3 芯片是南亚的 NT5CC256M16ER-EKI, NT5CC256M16ER-EKI 的 bank 位宽为 3,行位宽为 15,列位宽为 10,所以它的地址大小等于 2^3*2^15*2^10(即 2^28=256M),数据位宽为 16bit,所以容量大小为 256M*16bit,也就是 512MByte。

shuidiQAQ的博客 3031

Java并发编程(11)-使用ReentrantLock与Condition实现生产者-消费者队列

Condition在Java并发编程中是一个十分常用的接口,被称为条件变量,常与显式锁和可重入锁一起使用,它可以在某些条件下使线程进行休眠或者唤醒,本文将以实现生产者-消费者模式的队列作为demo让大家对条件变量 有初步的了解。

BoringError的博客 1048

人工智能技术基础系列之:迁移学习

作者:禅与计算机程序设计艺术 1.背景介绍 随着深度学习和神经网络的快速发展,越来越多的应用场景需要处理大量的数据和复杂的任务。然而,由于计算资源、存储空间等条件的限制,传统的人工智能方法往往不能满足实际需求。因此,为了提高效率和降低成本,研究人员提出了迁移学习的概念。本篇文章将详细介绍迁移学习的基

AI天才研究院 695

java - ReentrantLock和Condition实现生产者-消费者

java - ReentrantLock和Condition实现生产者-消费者ReentrantLock重入锁(ReentrantLock)是一种递归无阻塞的同步机制。一个可重入的互斥锁(Lock),它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义,但功能更强大。 1. ReentrantLock 将由当前已经成功获得锁,并且还没有释放锁的线程所拥

Duan的博客 1006

vue2/3 - 详细对接海康监控实时视频预览和录像回放功能,vue接入使用海康视频监控播放器实时推流等功能,支持hik/rtsp/rtmp/hls/ws取流协议(详细教程与示例代码,一键复制开箱即用

vue2,vue3,海康,vue海康视频监控,海康开放平台,如何接入海康的实时监控,海康威视,Vue实现海康监控视频播放,vue3对接海康视频监控播放、回放的方法流程,实现海康H5视频插件播放视频的实例,web网页接入海康,海康威视的视频vue的录像回放和实时预览,前端vue3项目接入海康威视h5player.js播放器,vue2接入海康威视视频监控平台,使用海康监控H5视频播放,对接海康视频监控,海康视频web插件,web前端在vue中通过海康插件嵌入视频,实现实时预览,vue3海康监控播放器组件,vue

✅ 精选推荐文章 1万+

【五分钟论文笔记】Vision Banana:图像生成器成为通用视觉学习器

图像生成训练可以像 LLM 预训练一样,让模型学习强大且通用的视觉表示感知即生成——将视觉任务输出参数化为 RGB 图像,是一种优雅且强大的统一框架视觉理解能力可以在不牺牲生成能力的情况下获得——两者可以共存于同一个模型。

专注:太空算力、AI infra、异构调度、大模型成本工程 231

Java多线程问题--ReentrantLock和Condition实现多生产者/多消费者模式以及唤醒特定线程

本文内容部分引自《Java多线程编程核心技术》,感谢作者!!! 代码地址:https://github.com/xianzhixianzhixian/thread.git ReentrantLock和Condition基本用法 1、ReentrantLock类中的lock()和unlock()方法要成对使用,lock()方法使当前线程获得对象锁,unlock()方法使当前线程释放对象锁。...

樊先知樊先知的博客 725

使用R语言实战:构建Logistic回归模型

Logistic回归是一种基于概率的分类算法,它用于预测离散的结果变量(也称为响应变量或因变量)。与线性回归不同,Logistic回归的输出是一个概率值,通常在0和1之间。这使得它非常适合处理二分类问题。市场营销:预测客户是否会购买某个产品。医学研究:预测疾病的发生与否。信用风险评估:预测个人申请贷款的违约风险。社会科学:预测个人对某个政策的态度。

2301_79331230的博客 1139

详解ReentrantLock之Condition原理

Condition Jdk中独占锁的实现除了使用关键字synchronized外,还可以使用ReentrantLock。虽然在性能上ReentrantLock和synchr...

Daniel的博客 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java多线程并发控制:使用ReentrantLock实现生产者-消费者模型

使用ReentrantLock实现生产者-消费者模型

言不信者行不果,行不敏者言多滞. 1640

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ReentrantLock详细讲解,什么是ReentrantLock锁,什么是Condition条件变量(二)

juc、ReentranLock

zhangfuping123456789的博客 8372

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java-ReentrantLock(重入锁)+Condition-解决生产者,消费者模型

说在前面的话:此篇实质是为了探讨ReentrantLock+Condition的应用场景,借用生产者消费者模型来解释。 重点实现线程间通信 juc之ReentrantLock+Condition,await、signal方法(对比)synchronized+Object的wait、notify。 ReentrantLock对比snchronized ReentrantLock支持公平锁和非...

windflybird 4151

03多线程-用ReentrantLock实现生产者和消费者模式

ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性,synchronized通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock还支持公平锁和非公平锁两种方式。

rainyonelove的专栏 1283

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

生产者-消费者模式 系列 之二 ReentrantLock, Condition 篇

在生产者-消费者模式 系列 之一 Sychronized,Notify,Wait 篇中对Java多线程通讯,同步的典型知识点做了介绍. 这篇文章将主要集中在JDK 1.5中引入的 lock 机制和其对应的condition 条件变量.  将通过ReentrantLock 来实现系列一中同样功能的生产者-消费者模式.      Lock :  Lock概念的出现,乍一看是把Java中一直使用的

TechNerd的专栏 2050

ReentrantLock与Condition实现生产者消费者,模拟延时用LockSupport.parkNanos

使用ReentrantLock与Condition实现生产者消费者 主要有Producer,Consumer,Pool 生产池 在测试多线程程序时,最后【多建线程】才能明显看出并发时,是否数据异常。建议10到30个线程 创建的线程数少,模拟的延时太高,多线程可能会依次执行,不能判断是否线程安全 Pool生产池,封装也生产与消费的方法,注意里面的【while循环】判断Pool是否满或者空,负责会产出...

老专家的博客 2616

Java中的生产者/消费者模型

生产者-消费者模型(Producer-Consumer problem)是一个非常经典的多线程并发协作的模型。比如某个模块负责生产数据,而另一个模块负责处理数据。产生数据的模块就形象地被称为生产者;而处理数据的模块,则被称为消费者。生产者和消费者在同一段时间内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞。

u010257931的博客 6812

使用Condition之生产者消费者

使用Condition之生产者消费者

weixin_45428910的博客 862

用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实现生产者:负责生产消息,在缓冲区满后休眠; 消费者:负责消费消息,在缓冲区空后休眠;两者的休眠何时唤醒?1.生产者休眠,是因为缓冲区满,所以只要消费者进行了消费,那么缓冲区就会有新的空间,生产者就可以继续生产,故每次消费者消费以后都要试图唤醒生产者,无论生产者是否休眠。2.消费者休眠,是因为缓冲区空,所以只要生产者进行了生成,那么缓冲区就会有新的消息,消费者就可以继续生产,

潜心种树 5511

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的博客 399
上一篇: 数据采集 htmlunit 使用心得
下一篇: jdk升级17 项目报错java.lang.reflect.InaccessibleObjectException
hamish-wu
博客等级 码龄15年 2814粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值