Java实现简单的阻塞队列

118 篇文章 3 订阅
114 篇文章 2 订阅
class MyBlockingQueue {
    //这里队列底层用数组实现
    private int[] queue = new int[1000];
    //创建size变量记录队列现有元素的数量
    private int size = 0;
    //创建队头指针
    private int head = 0;
    //创建队尾指针
    private int tail = 0;
    //创建锁对象
    private Object locker = new Object();
    //向队列中添加元素,通过加锁操作当队列为满时阻塞,队列不满时才能添加
    public void put(int value) throws InterruptedException {
        synchronized (locker) {
            if (size == queue.length) {
                locker.wait();
            }
            queue[tail] = value;
            tail++;
            //或者写成tail = tail % queue.length,但在运行性能上CPU执行条件跳转更容易一些,取模操作比较麻烦一些
            if (tail >= queue.length) {
                tail = 0;
            }
            size++;
            //解除队列为空时等待添加元素的阻塞,解除的是take方法中的wait
            locker.notify();
        }
    }
    //出队列,当队列为空时阻塞等待,直到队列中添加了元素
    public Integer take() throws InterruptedException {
        synchronized (locker) {
            if (size == 0) {
                locker.wait();
            }
            int ret = queue[head];
            head++;
            //或者写成head = head % queue.length,但在运行性能上CPU执行条件跳转更容易一些,取模操作比较麻烦一些
            if (head >= queue.length) {
                head = 0;
            }
            size--;
            //解除队列满时等待出队列的阻塞,此处解除的是put方法中的wait
            locker.notify();
            return ret;
        }
    }
}
public class Demo3 {
    //创建一个阻塞队列,来起到生产者消费者模型中“削峰填谷”的效果
    private static MyBlockingQueue queue = new MyBlockingQueue();

    public static void main(String[] args) {
        //实现一个简易的生产者消费者模型
        Thread producer = new Thread(() -> {
            int num = 0;
            while (true) {
                try {
                    queue.put(num);
                    System.out.println("生产了" + num);
                    num++;
                    //此处可以看出生产者慢时,消费者也会跟着生产者的生产速率消费
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        producer.start();
        Thread customer = new Thread(() -> {
            while (true) {
                try {
                    int num = queue.take();
                    System.out.println("消费了" + num);
                    //此处可以看出,当消费者慢时,当生产者生产了大量数据,消费者会按照自己的节奏消费,生产者随后也就会随着消费者的速率生产
                    //Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        customer.start();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值