java基于数组实现队列(四)

概述

实现我上一篇博客中提到的

实际上,就是用synchronized代码块解决线程安全问题,以及利用wait()、notify()实现线程阻塞、唤醒。

实现

pollV3()

java 复制代码
	private Object lockBySynchronized=new Object();
java 复制代码
	public int pollV3() {
        synchronized (lockBySynchronized){ //synchronized代码块解决线程安全问题 
            while (tail == 0) { // 没有元素
                try {
                    lockBySynchronized.wait(); // 让出队元素的线程阻塞 直到被其他线程唤醒
                } catch (InterruptedException e) {
                    log.info("等待队列有元素的过程中被打断",e);
                }
            }

            int polled = arr[0]; // 队头元素
            log.info("出队成功,队头元素为:{}",polled);
            System.arraycopy(arr,1,arr,0,tail-1);
            tail--; // 出队后 tail往前移动一位
            lockBySynchronized.notify();
            return polled;
        }

    }

offerV3()

java 复制代码
	public void offerV3(int value) {
        synchronized (lockBySynchronized){
            while (tail == capacity) {
                try {
                    lockBySynchronized.wait(); // 当前线程阻塞直到被唤醒或打断(其他线程调用signal方法,并且唤醒的线程刚好是该线程或其他线程调用signalAll方法) 关联该condition的锁会被自动释放
                } catch (InterruptedException e) {
                    log.info("被打断了...");
                }
            }
            arr[tail] = value;
            log.info("元素 {}入队成功",value);
            tail++;
            lockBySynchronized.notify(); // 唤醒要出队元素的线程 执行出队元素的逻辑
        }

    }

测试用例

java 复制代码
	public static void main(String[] args) throws InterruptedException {
        ArrayQueue queue = new ArrayQueue(3);

        Thread t1 = new Thread(() -> {
            queue.offerV3(1);
            queue.offerV3(2);
        }, "t1");

        Thread t2 = new Thread(() -> {
            queue.offerV3(3);
        }, "t2");

        Thread t3 = new Thread(() -> {
            queue.offerV3(4);
        }, "t3");

        t1.start();
        t2.start();
        t3.start();

        //25ms以后执行一次出队操作 由于发生了出队操作 入队操作就应该可以成功
        log.info("5s以后执行一次出队操作");
        TimeUnit.SECONDS.sleep(5);
        int polled = queue.pollV3();
        log.info("出队的元素:{}",polled);

        // t1 t2 t3 3个线程的代码都执行完后再遍历队列
        t1.join();
        t2.join();
        t3.join();

        queue.print();

    }

测试用例输出

最后

这篇博客应该就是基于数组实现队列的最后一篇了吧。

好了,如果对你有帮助的话,欢迎点个免费的赞哦。

相关推荐
djarmy2 小时前
MAIN.c(1): warning C318: can’t open file ‘STC8G.H’ 报错 解决 分析
c语言·开发语言·mongodb
HEJOO92 小时前
深入理解 Java volatile 关键字:原理、用法与常见误区
java·开发语言·spring
曹牧2 小时前
Java:no content to map due to end of input
java·开发语言
阿维的博客日记2 小时前
Example 类全场景实战指南
java·mybatis
梦梦代码精2 小时前
《回收租赁系统技术选型避坑指南:业务闭环与二开自由度详解》
开发语言·低代码·docker·开源·代码规范
两点王爷2 小时前
SpringBoot 项目集成 GeoServer 源码,实现地图服务发布
java·spring boot·后端
隔窗听雨眠2 小时前
记一次SQL Server数据库性能分析:从CPU100%到单配置修复的完整诊断
开发语言·数据库·php
David猪大卫3 小时前
【C++修炼】智能指针使用及原理
开发语言·c++·经验分享·笔记·学习·考研·面试
charlie1145141913 小时前
现代Qt开发之图像处理进阶:像素操作与格式转换
开发语言·图像处理·qt
李永奉3 小时前
中科蓝讯SDK开发-BT893x 面条耳机连接vivo手机后连接APP端,最后手机端设置页面手动断开蓝牙连接,此时耳机端假断开
c语言·开发语言·嵌入式硬件·物联网·智能手机·电脑