首页 > 其他分享 >生产者消费者

生产者消费者

时间:2024-11-24 15:33:55浏览次数:3  
标签:ProducerConsumer 消费者 Thread 生产者 lock pc new public

ReentrantLock + Condition 实现

package org.example;

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class ProducerConsumer {
    private Queue<String> queue = new LinkedList<>();
    
    private static final Integer BUFFER_SIZE = 3;
    private final ReentrantLock lock = new ReentrantLock();
    private final Condition producerCondition = lock.newCondition();
    private final Condition consumerCondition = lock.newCondition();

    public void produce() {
        lock.lock();
        while (queue.size() >= BUFFER_SIZE) {
            try {
                producerCondition.await();
            } catch (InterruptedException e) {

            }
        }
        queue.add(Thread.currentThread().getName());
        System.out.println("[Producer]" + Thread.currentThread().getName());
        consumerCondition.signal();
        lock.unlock();
    }

    public void consume() {

        lock.lock();
        while (queue.isEmpty()) {
            try {
                consumerCondition.await();
            } catch (InterruptedException e) {

            }
        }
        String elem = queue.poll();
        System.out.printf("[Consumer] Thread: %s, consume: %s%n\n", Thread.currentThread().getName(), elem);
        producerCondition.signal();
        lock.unlock();
    }

    static class Producer implements Runnable {
        ProducerConsumer pc;

        public Producer(ProducerConsumer pc) {
            this.pc = pc;
        }

        @Override
        public void run() {
            int times = 3;
            while (times-- > 0) {
                pc.produce();
            }
        }
    }

    static class Consumer implements Runnable {
        ProducerConsumer pc;

        public Consumer(ProducerConsumer pc) {
            this.pc = pc;
        }

        @Override
        public void run() {
            int times = 3;
            while (times-- > 0) {
                pc.consume();
            }
        }
    }

    public static void main(String[] args) {
        ProducerConsumer producerConsumer = new ProducerConsumer();
        Producer producer = new Producer(producerConsumer);
        Consumer consumer = new Consumer(producerConsumer);
        Thread t1 = new Thread(producer);
        Thread t2 = new Thread(producer);
        Thread t3 = new Thread(consumer);
        Thread t4 = new Thread(consumer);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }

}

还有BlockingQueue实现,也是线程安全的

标签:ProducerConsumer,消费者,Thread,生产者,lock,pc,new,public
From: https://www.cnblogs.com/GY8023/p/18565862

相关文章

  • 生产者消费者c++ 讲解和代码示例
    生产者-消费者问题的C++讲解和代码示例一、问题描述生产者-消费者问题是经典的多线程同步问题,涉及两个类型的线程:生产者线程:负责生成数据并放入共享缓冲区。消费者线程:负责从共享缓冲区取出数据进行处理。关键挑战在于:同步:确保生产者和消费者在访问共享缓冲区时不发生......
  • 消费者Rebalance机制
    优质博文:IT-BLOG-CN一、消费者Rebalance机制在ApacheKafka中,消费者组ConsumerGroup会在以下几种情况下发生重新平衡Rebalance:【1】消费者加入或离开消费者组:当一个新的消费者加入消费者组或一个现有的消费者离开消费者组时,Kafka会触发重新平衡,以重新分配分区给消费者......
  • 使用微服务Spring Cloud集成Kafka实现异步通信(消费者)
    1、本文架构本文目标是使用微服务SpringCloud集成Kafka实现异步通信。其中KafkaServer部署在Ubuntu虚拟机上,微服务部署在Windows11系统上,KafkaProducer微服务和KafkaConsumer微服务分别注册到Eureka注册中心。KafkaProducer和KafkaConsumer之间通过KafkaServer实现异......
  • 合合信息核心产品新增付费用户下滑创新低,消费者投诉不少
    《港湾商业观察》施子夫9月26日,上海合合信息科技股份有限公司(以下简称,合合信息)将在上交所科创板上市,发行价55.18元/股,计划发行2500万股,证券代码“688615”。公开信息显示,2021年9月,合合信息的上交所IPO获受理,独家保荐机构中金公司。2023年8月,在2023年第70次上交所上市委审核......
  • 【线程】POSIX信号量---基于环形队列的生产消费者模型
    信号量概念这篇文章是以前写的,里面讲了 SystemV的信号量的概念,POSIX信号量和SystemV信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源目的。但POSIX可以用于线程间同步。信号量的概念POSIX信号量的接口初始化信号量参数:pshared:0表示线程间共享,非0表示进程......
  • NetCore Channel-生产者&消费者
    usingSystem.Threading.Channels;namespaceChannelDemo{publicclassChannelMgr{//优势//允许开发者根据需要创建具有固定容量(有界)或无限容量(无界)的通道//staticChannel<string>channel=Channel.CreateBounded<strin......
  • Kafka生产者如何实现消息的批量发送?
    ApacheKafka生产者可以实现消息的批量发送,这有助于提高数据传输的效率并减少网络负载。在Kafka中,生产者可以配置几个参数来控制批量发送的行为:batch.size:这个参数指定了生产者批次的大小(以字节为单位)。当生产者收集到一定数量的消息(达到指定的字节数),它会将这些消息......
  • Java多种方式实现 有界缓冲区下的多个生产者、消费者模型 (Semaphore、while+wait+noti
    /**@Author:SongyangJi@ProjectName:learn-multiThread@Version1.0@Description:*/classProducerThreadextendsThread{intrate;MultiProducerConsumermultiProducerConsumer;publicProducerThread(intrate,MultiProducerConsumermultiProducer......
  • 解锁淘宝商品评论 API,精准把握消费者需求
    在电商领域,商品评论和详情信息是消费者做出购买决策的重要参考。淘宝和天猫作为中国领先的电商平台,提供了丰富的API接口,允许商家和开发者获取这些关键数据。本文将详细介绍如何利用淘宝/天猫的商品评论API接口和商品详情高级版API,高效挖掘电商数据,为商业决策提供数据支持。以下......
  • 【LabVIEW学习篇 - 24】:生产者/消费者设计模式
    文章目录生产者/消费者设计模式案例:控制LED等亮灭生产者/消费者设计模式生产者/消费者是多线程编程中最基本的一种模式,使用非常普遍。从软件角度看,生产者就是数据的提供方,而消费者就是数据的消费处理方,二者之间存在一个数据缓存区。在新建中可创建生产者/消费者......