生产者消费者场景,实现控制生产者消费者数量和生产消费速度。

题目如下:

1). 有多个线程,一个线程为生产者,其他线程为消费者;
2). 生产者生产商品,未消费的商品达到 20 件时就休息,小于 20 件时就继续生产;
3). 消费者消费商品,当没有可消费的商品时就休息,有可消费的商品时就继续消费;
4). 主入口函数 main 的输入参数有 3 个,分别为:消费者线程个数,生产速度(件/秒),消费速度
(件/秒)。例如消费者线程个数为 2,生产速度为 8(即每 125 ms 生产 1 件商品),消费速度为 3(即
每 1000/3 ms 消费 1 件商品)。

代码如下:

public class Test {
    private static int queueSize = 20;
    private static ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(queueSize);  //阻塞队列不用手动进行暂停唤醒线程

    public static void main(String[] args) throws InterruptedException {
        Test.start(10,8,3);
    }

    public static void start(int i,int product,int consume) throws InterruptedException {
        Producer producer = new Producer(product);
        producer.start();  //启动消费者线程
        Thread.sleep(10000); //停顿10秒让生产者生产,当超过20就不生产
        for(int j = 1 ;j < i;j++){
            Consumer consumer = new Consumer("消费者"+j,consume);
            consumer.start();
        }
    }

    //消费者
    static class Consumer extends Thread{

        String name;
        int consumer;  //消费速度

        Consumer(String name,int consumer){
            this.name = name;
            this.consumer = consumer;
        }

        @Override
        public void run() {
            consume();
        }

        private void consume() {
            consumer = 1000 / consumer;
            while(true){
                try {
                    sleep(consumer);
                    queue.take();
                    System.out.println(name+"从队列取走一个元素,产品剩余个数:"+queue.size());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //生产者
    static class Producer extends Thread{

        int product;  //生产速度

        Producer(int product){
            this.product = product;
        }

        @Override
        public void run() {
            produce();
        }

        private void produce() {
            product = 1000 / product;
            while(true){
                try {
                    sleep(product);
                    queue.put(1);
                    System.out.println("生产者向队列取中插入一个元素,"+"生产商品总个数:"+queue.size());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

结果如下:
先生产20个再让消费者开始消费

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值