实现一个简单的阻塞队列

本文探讨如何在Java中实现一个阻塞队列,分别针对只有一个生产者和一个消费者以及多个生产者和消费者的情况。在多线程环境下,当使用wait和notify进行同步时,可能会遇到生产者和消费者线程唤醒的随机性问题,导致队列空闲而所有线程等待。解决这个问题的方法是将notify替换为notifyAll,确保正确唤醒等待的线程。
摘要由CSDN通过智能技术生成

目录

只有一个生产者一个消费者时: 

 多个生产者和消费者时:


 

只有一个生产者一个消费者时: 

public class MyArrayBlockingQueue {
    private long[] array;
    private int frontIndex;//永远在队列的第一个元素位置
    private int rearIndex;//永远在队列的最后一个元素位置的下一个位置
    private int size;

    public MyArrayBlockingQueue(int capacity) {
        array = new long[capacity];
        frontIndex = 0;
        rearIndex = 0;
        size = 0;
    }

    /**
     * 向阻塞队列中添加元素
     *
     * @param e
     */
    public synchronized void put(long e) throws InterruptedException {
        //判断队列是否已满
//        if (array.length == size) {
//            //队列已满 等待
//            this.wait();
//
//        }
        while (array.length==size){
            this.wait();
        }
        //预期:队列一定不是满的 考虑到wait 有一种被唤醒的条件是假唤醒,假唤醒的队列是满的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值