前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >阻塞队列实现

阻塞队列实现

作者头像
用户10921393
发布2024-07-19 08:25:04
70
发布2024-07-19 08:25:04
举报
文章被收录于专栏:Y.
代码语言:javascript
复制
class MyBlockingQueue {
    private String[] elems = null;
    private int head = 0;
    private int tail = 0;
    private int size = 0;
    private Object locker = new Object();//锁对象
    
    public MyBlockingQueue(int capacity) {
        elems = new String[capacity];
    }
    
    public void put(String elem) throws InterruptedException {
        synchronized (locker) {
            while (size >= elems.length) {
                //队列满了,产生阻塞
                locker.wait();
            }
            elems[tail] = elem;
            tail ++;
            if (tail >= elems.length) { //循环队列
                tail = 0;
            }
            size ++;
            locker.notify(); //入队之后重新唤醒
        }
    }
    
    public String take() throws InterruptedException {
        String elem = null;
        synchronized (locker) {
            while (size == 0) {
                locker.wait();//队列空了,产生阻塞
            }
            elem = elems[head];
            head ++;
            if (head >= elems.length) {
                head = 0;
            }
            size --;
            locker.notify();//元素出队列之后, 唤醒
        }
        return elem;
    }
}

1.通过"循环队列" 的方式来实现 2. 使用 synchronized 进行加锁控制. 3.put 插⼊元素的时候, 判定如果队列满了, 就进⾏ wait. (注意, 要在循环中进⾏ wait 被唤醒时不⼀定 队列就不满了,因为同时可能是唤醒了多个线程). 4. take 取出元素的时候, 判定如果队列为空, 就进⾏ wait. (也是循环 wait).

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档