使用 wait(),notify(),notifyAll() 简单实现阻塞队列

该博客演示了如何使用Java创建一个基于数组的阻塞队列。队列具有最大容量,使用前线后出(FIFO)原则。两个线程不断尝试从队列中取出元素,而第三个线程则负责向队列中添加元素。当队列满或空时,线程会进入等待状态,直到条件满足。
摘要由CSDN通过智能技术生成

队列可以使用数组或链表进行实现,这里使用数组模拟队列
队列有一个最大容量 maxSize,并且有两个变量 front 和 rear 分别用来记录队列前后端的下标

public class BlockingQueueDemo {
    public static void main(String[] args) {
        BlockingQueue blockingQueue = new BlockingQueue(1000);
        new Thread(()->{
            for (int i = 1; i <= 100; i++) {
                try {
                    blockingQueue.put(i);
                    Thread.sleep((long)Math.random() * 10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "Thread1").start();

        new Thread(() -> {
            while (true) {
                try {
                    int take = blockingQueue.take();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "Thread--2").start();
        new Thread(() -> {
            while (true) {
                try {
                    int take = blockingQueue.take();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "Thread--3").start();
    }
}

class BlockingQueue {
    private int[] queue; // 存放数据,模拟队列
    private volatile int maxSize; // 最大容量
    private volatile int front; // 队列头部数据再向前一位位置
    private volatile int rear; // 指向队列尾部最后一个数据位置

    public BlockingQueue (int maxSize) {
        this.maxSize = maxSize;
        queue = new int[maxSize];
        front = -1;
        rear = -1;
    }

    // 判断队列是否已满
    public boolean isFull() {
        return rear == maxSize - 1;
    }

    // 判断队列是否为空
    public boolean isEmpty() {
        return rear == front;
    }

    // 队列操作:入队列
    public synchronized void put(int value) throws InterruptedException {
        // 队列满,阻塞
        while (isFull()) {
            System.out.printf("队列满,%s正在等待\n", Thread.currentThread().getName());
            this.wait();
        }
        // 队列空,唤醒所有阻塞线程
        if (isEmpty()) {
            notifyAll();
        }
        // 入队列
        rear++;
        queue[rear] = value;
        this.notify();
        System.out.printf("%s向队列中添加数据%d成功\n", Thread.currentThread().getName(), queue[rear]);
    }

    // 队列操作:出队列
    public synchronized  int take() throws InterruptedException {
        // 队列为空,阻塞
        while (isEmpty()) {
            System.out.printf("队列空,%s正在等待~~~\n", Thread.currentThread().getName());
            this.wait();
        }
        if (isFull()) {
            notifyAll();
        }
        front++;
        notify();
        System.out.printf("%s从队列中取出元素%d\n", Thread.currentThread().getName(), queue[front], queue.length);
        return queue[front];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一起来搬砖呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值