5. 阻塞队列解决生产者与消费者问题

有三个组成部分:缓冲区、生产者、消费者

生产者负责往缓冲区添加数据,消费者负责往缓冲区消耗数据,如何保证运行的时候使得生产者在缓冲区满时不添加数据,消费者在缓存空时不消费数据,这样的一个问题,就是生产者消费者问题

Demo 代码实现

使用阻塞队列实现:

生产者:

class Producer extends Thread {
    BlockingQueue<String> buffer;

    public Producer(BlockingQueue<String> buffer) {
        this.buffer = buffer;
    }

    @Override
    public void run() {
        try {
            this.buffer.put("product");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Producer is producing...");
    }
}

消费者:

class Consumer extends Thread {
    BlockingQueue<String> buffer;

    public Consumer(BlockingQueue<String> buffer) {
        this.buffer = buffer;
    }

    @Override
    public void run() {
        try {
            this.buffer.take();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Consumer is consuming...");
    }
}

Demo 测试:

class ProducerConsumerDemo {
    public static void main(String[] args) {
        BlockingQueue<String> buffer = new ArrayBlockingQueue<>(5);
        for (int i = 0; i < 6; i++) {
            new Producer(buffer).start();
        }
        for (int i = 0; i < 8; i++) {
            new Consumer(buffer).start();
        }
        for (int i = 0; i < 2; i++) {
            new Producer(buffer).start();
        }
    }
}

结果:

Producer is producing...
Producer is producing...
Producer is producing...
Producer is producing...
Producer is producing...
Producer is producing...
Consumer is consuming...
Consumer is consuming...
Consumer is consuming...
Consumer is consuming...
Consumer is consuming...
Consumer is consuming...
Producer is producing...
Consumer is consuming...
Producer is producing...
Consumer is consuming...

可以看见,虽然生产者在并***况下会出现不同步的情况,但缓冲区的结果严格符合两个问题的要求

全部评论

相关推荐

06-26 15:35
武汉大学 运营
点赞 评论 收藏
分享
05-25 10:45
门头沟学院 Java
Frank_zhan...:没实习一个项目肯定不够,可以再做一个轮子,技术栈再补一个mq,微服务,整体再换个简历模板,暑期尽量再找一个日常实习
无实习如何秋招上岸
点赞 评论 收藏
分享
迟缓的斜杠青年巴比Q...:简历被投过的公司卖出去了,我前两天遇到过更离谱的,打电话来问我有没有意向报班学Java学习,服了,还拿我学校一个学长在他们那报班学了之后干了华为OD当招牌
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-27 15:07
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务