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

第一章:信号链的精度之战:深入解决电流采样偏差 摘要:本文深入探讨了FOC控制中电流采样偏差问题及其解决方案。电流采样偏差主要来源于偏移误差、增益误差、非线性误差和温漂四大类,其中偏移误差对FOC性能影响最为严重。硬件方面建议采用高精度采样电阻、低失调运放和独立基准电压等设计;软件层面提出了上电自动零点校准、在线实时补偿和模型闭环补偿三种策略。最后介绍了量产自动化校准系统,通过硬件优化和软件补偿相结合,确保每台产品电流采样精度的一致性,为FOC控制奠定坚实基础。 阅读详情

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

使用公平锁实现,
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();
            }
        }
    }

}
基于遗传算法的码头泊位分配调度优化问题求解 例如,基因型为 [3, 1, 4, 2] 表示第一艘停靠在第三个泊位,第二艘停靠在第一个泊位,以此类推。同时,该码头有 n 艘船需要停靠,每艘船的货物数量、船长、船宽都不同,需要根据其特性来分配合适的泊位,并确定每个泊位的使用时间,以最大化码头的使用效率。码头的泊位分配调度是一个关键的物流问题,它涉及到船舶的进出港、货物的装卸和存储等多个方面,因此对其进行优化是至关重要的。根据得到的最优个体,可以得到每个泊位停靠的船只、使用时间等信息,从而确定码头的泊位分配调度方案。% 不同船只的货物数量。 阅读详情

相关推荐

数学建模国赛C题实战:从数据预处理到模型优化的完整流程(附Python代码)

本文系统讲解了数学建模国赛C题的完整实战流程,涵盖从数据预处理、模型选择与构建到优化与结果可视化的关键步骤。文章重点分享了如何利用Python进行高效的数据清洗、特征工程,并提供了多种机器学习模型的实现代码与对比验证方法,旨在帮助参赛者构建逻辑清晰、结果可靠的解决方案。

weixin_29079643的博客 293

使用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

SpringBoot集成SpringSecurity5和OAuth2 — 2、OAuth2客户端【SSO单点登录时作为客户端】

SpringBoot集成SpringSecurity5和OAuth2 — 2、OAuth2客户端【SSO单点登录时作为客户端】

Mr_XiMu的博客 3741

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

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

muer_123的博客 545

C#与YOLOv8工业缺陷检测实战:从算法到PLC集成的工程化落地

目标检测作为计算机视觉的核心任务,其原理是通过深度学习模型在图像中定位并识别物体。这项技术的关键价值在于将AI的感知能力转化为实际生产力,尤其在工业自动化领域,它能实现高效、精准的视觉检测。在工业缺陷检测这一典型应用场景中,稳定性和实时性是核心挑战。本文聚焦于如何将YOLOv8这一先进的目标检测模型,与C#上位机开发及工业相机硬件深度集成,构建一个能够7x24小时稳定运行的智能检测系统。文章深入探讨了从模型训练、ONNX部署,到与PLC通信联调的完整工程化路径,并针对工业环境中常见的稳定性、性能及调试问题提

weixin_33508411的博客 236

告别外置电阻!揭秘MAX22201集成电流检测的5大设计优势(附PCB布局案例)

本文深入解析MAX22201集成电流检测技术在直流有刷电机驱动中的5大设计优势,包括BOM成本降低、PCB空间优化、动态性能提升等。通过与传统方案(如DRV8871+外置电阻)的实测对比,展示其在高精度电流检测、抗干扰能力和PCB布局简化方面的突破,并附有详细的PCB布局案例和配置指南。

weixin_29189377的博客 243

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

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

BoringError的博客 1048

【大二组培训】2017年电子设计大赛H题总结(软件部分)

文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt im

HAIBARA的博客 3021

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

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

Duan的博客 1006

实战演练:用wvp-GB28181-pro + ZLMediaKit搭建一个可用的国标视频监控测试环境(附设备模拟器对接)

本文详细介绍了如何使用wvp-GB28181-pro和ZLMediaKit在Ubuntu系统上搭建GB28181视频监控测试环境。从环境准备、组件解析到核心服务部署与设备模拟器对接,提供完整的实战指南,帮助开发者快速构建可验证的监控系统。

weixin_42692935的博客 579

OpenCV实战之人脸美颜美型(八)——大眼(下)

我们需要将上述描述量化表达,以r代表上述变形区域的圆的半径,X表示原始图像像素到变形圆圆心的距离,Y表示像素变形后的其距离变形圆圆心的距离,则其形状大致如下图所示。如下图所示,我们可以规定处理区域为眼睛为圆心的一个圆形,从圆心区域开始图像会放大,但该放大的比例随着距离圆心的距离而变小,直至边缘区域的放大比例为0。不过在实际图像变形操作中我们要从目标图像映射到原图,因此我们需要将X/Y调换,让X表示变形后图像的像素距离变形圆中心的距离,Y表示原图像素距离变形圆中心的距离,则其形状如下图所示。

On my way 901

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

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

樊先知樊先知的博客 725

自助结账商品检测(Scanned Item Detection)——基于YOLOv8的RPC数据集实战

RPC数据集是由中国科学院自动化研究所发布的零售商品结账检测公开数据集,广泛用于自助结账和零售场景下的目标检测与识别。YOLOv8是YOLO系列最新版本,由Ultralytics推出,继承了YOLO家族的高效快速和高准确性,适用于实时检测场景。本文系统介绍了基于YOLOv8的RPC数据集自助结账商品检测方案,涵盖数据准备、训练、推理及UI界面设计。未来,可结合多模态感知、RFID融合技术,打造更加智能和稳定的自助结账系统。

YOLO 248

详解ReentrantLock之Condition原理

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

Daniel的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

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

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

juc、ReentranLock

zhangfuping123456789的博客 8372

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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、付费专栏及课程。

余额充值