【机试题】队列并发消费问题

news/2024/7/8 4:39:03 标签: java, Semaphore, BlockingQueue, Runnable

编写一个队列,生产者生产消息(消息内容是1,2,3,…,n),消费者消费消息,并将消息打印到控制台。
要求:

  1. 生产者以每秒10个的速率生产消息,队列满了后阻塞等待;
  2. 队列长度为100;
  3. 消费者以每秒1个的速率消费消息;
    生产者和消费者在不同的线程;
  4. 起20个消费者线程;
  5. 消费者取不到消息的时候阻塞等待;
  6. 不能重复消费;
java">

import java.util.concurrent.*;

class Message {
    private final int value;

    public Message(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

class Producer implements Runnable {
    private final BlockingQueue<Message> queue;

    public Producer(BlockingQueue<Message> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        try {
            for (int i = 1; i <= 1000; i++) {
                Message message = new Message(i);
                queue.put(message);
                System.out.println("Produced: " + message.getValue());
                Thread.sleep(100); // 生产者以每秒10个的速率生产消息
                synchronized (this) {
                    while (queue.remainingCapacity() == 0) {
                        wait();
                    }
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class Consumer implements Runnable {
    private final BlockingQueue<Message> queue;
    private final Semaphore semaphore;

    public Consumer(BlockingQueue<Message> queue, Semaphore semaphore) {
        this.queue = queue;
        this.semaphore = semaphore;
    }

    @Override
    public void run() {
        try {
            while (true) {
                Message message = queue.take(); // 取不到消息时阻塞等待
                System.out.println("Consumed: " + message.getValue());
                semaphore.acquire(); // 不能重复消费,使用信号量控制消费者数量
                Thread.sleep(1000); // 消费者以每秒1个的速率消费消息
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            semaphore.release(); // 释放信号量,允许其他消费者继续消费
        }
    }
}

public class Main {
    public static void main(String[] args) {
        int numConsumers = 20; // 起20个消费者线程
        Semaphore semaphore = new Semaphore(numConsumers); // 控制消费者数量
        BlockingQueue<Message> queue = new LinkedBlockingQueue<>(100); // 队列长度为100
        Producer producer = new Producer(queue); // 生产者线程
        for (int i = 0; i < numConsumers; i++) { // 创建20个消费者线程并启动它们
            new Thread(new Consumer(queue, semaphore)).start(); // 消费者线程,取不到消息时阻塞等待,不能重复消费,每秒消费1个消息,最多同时有20个消费者线程在运行。
        } // 启动生产者线程,每秒生产10个消息,队列满后阻塞等待。生产者和消费者在不同的线程中运行。
    }
}

http://www.niftyadmin.cn/n/5168199.html

相关文章

【洛谷 P1478】陶陶摘苹果(升级版)题解(向量+排序+贪心算法)

陶陶摘苹果&#xff08;升级版&#xff09; 题目描述 又是一年秋季时&#xff0c;陶陶家的苹果树结了 n n n 个果子。陶陶又跑去摘苹果&#xff0c;这次他有一个 a a a 公分的椅子。当他手够不着时&#xff0c;他会站到椅子上再试试。 这次与 NOIp2005 普及组第一题不同的…

Rust语言代码示例

安装Rust语言&#xff0c;然后创建一个新的Rust项目。接下来&#xff0c;你需要安装一个名为"requests"的Rust包&#xff0c;这个包可以帮助你发送请求。然后&#xff0c;你需要安装一个名为"rust-crawler"的Rust包&#xff0c;这个包可以帮助你编写爬虫程…

electron+vite+vue3项目打包

1.安装打包依赖&#xff0c;调整打包命令 npm install electron-builder -D 2.安装完成后&#xff0c;在 package json 中&#xff0c;配置 build 命令 "build": "vite build && electron-builder", 3.electron/index.js修改 win.loadURL 中…

让k8s主节点调度daemonset

1.去掉主节点的污点&#xff08;非常不推荐&#xff0c;使用方法2比较推荐&#xff09; kubectl taint nodes --all node-role.kubernetes.io/master- 2.在YAML文件中添加以下对守护进程集的容忍度&#xff0c;使k8s也能在主节点上调度守护进程集&#xff1a; ... kind: Daem…

5-3 使用函数计算两点间的距离

实现一个函数&#xff0c;对给定平面任意两点坐标(x​1​​,y​1​​)和(x​2​​,y​2​​)&#xff0c;求这两点之间的距离。‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪…

多测师肖sir_高级金牌讲师_ui自动化po框架版本01

ui自动化po框架 一、po框架 1、基本介绍 &#xff08;1&#xff09;po模式是page object model的缩写&#xff08;简称&#xff1a;po或pom&#xff09; &#xff08;2&#xff09; po模式的核心思想&#xff1a;分层&#xff0c;实现耦合 实现&#xff1a;业务流程与页面元素操…

基于广义回归神经网络的货运量预测

大家好&#xff0c;我是带我去滑雪&#xff01; 广义回归神经网络&#xff08;GRNN&#xff09;是径向基神经网络的一种&#xff0c;GRNN具有很强的非线性映射能力和柔性网络结构以及高度的容错性和鲁棒性&#xff0c;适合解决非线性问题。GRNN在逼近能力和学习速度上较RBF网络…

广州华锐互动:VR互动实训内容编辑器助力教育创新升级

随着科技的飞速发展&#xff0c;教育领域也正在经历一场深刻的变革。其中&#xff0c;虚拟现实(VR)技术为教学活动提供了前所未有的便利和可能性。在诸多的VR应用中&#xff0c;VR互动实训内容编辑器无疑是最具潜力和创新性的一种。广州华锐互动开发的这款编辑器以其独特的功能…