当前位置: 首页 > article >正文

Java面试篇基础部分- Java中的阻塞队列

  首先队列是一种前进后出的操作结构,也就是说它只允许从队列前端进入,从队列后端退出。这个前端和后端看个人如何理解,也就是通常所说的入队和出队,队头和队尾。

  阻塞队列和一般队列的不同就在于阻塞队列是可以阻塞的,这里所说的并不是说队列中间或者队头队尾被拦截了,而是一种操作队列的线程的一种状态。在阻塞队列中,线程阻塞有两种情况。

  • 消费者阻塞:也就是说,在队列为空的时候,没有任何数据的时候,队列消费者端就会被自动阻塞,一直到有任务进入到队列之后,消费者的线程就会被自动的唤起来消费任务。
    在这里插入图片描述
  • 生产者阻塞: 在队列已经满了,或者是没有可用空间的时候,生产者端的线程都会被阻塞,直到队列中的线程被消耗,有位置进入的时候,线程被自动唤醒,并且生产数据。
    在这里插入图片描述
      二者分别对应的出队,入队操作,当队列为空的时候,出队阻塞,当队列满的时候,入队阻塞。

阻塞队列的主要操作

  阻塞队列的主要操作有插入操作和移除操作。插入操作有add()、offer()、put(),移除操作有 remove()、poll()、take() 具体如下。

  1、插入操作

  public abstract boolean add(E paramE) ;将指定的元素插入到队列中,在成功的时候返回true,如果当前没有可用的空间,就会抛出IllegalStateException。如果该元素是null,就会抛出NullPointException的异常。

public boolean add(E e) {
   
      // 添加元素成功,返回 true
        if (offer(e))
            return true;
      // 添加元素失败,抛出异常
        else
            throw new IllegalStateException("Queue full");
    }

  public abstract boolean offer(E paramE);将指定的元素插入队列中,在成功的时候返回true,如果没有可以用的空间,则返回false。源码如下

 public boolean offer(E e) {
   
    // 检查元素是否为空
        checkNotNull(e);
        final ReentrantLock lock = this.lock;
    // 获取锁操作
        lock.lock();
        try {
   
          // 如果队列满了,则返回false
            if (count == items.length)
                return false;
            else {
   
              // 如果队列为空,则将元素加入到队列中
                enqueue(e);
                return true;
            }
        } finally {
   
          // 操作成功释放锁
            lock.unlock();
        }
    }

  offer(E o,long timeout,TimeUnit unit);将指定的元素插入到队列中,可以设置等待时间,如果在设定的等待时间内不能向队列中加入这个元素,就会返回false

public boolean offer(E e, long tim

http://www.kler.cn/a/317345.html

相关文章:

  • NVR录像机汇聚管理EasyNVR多品牌NVR管理工具/设备:大华IPC摄像头局域网访问异常解决办法
  • DBeaver 连接 OceanBase Oracle 租户
  • 图论-代码随想录刷题记录[JAVA]
  • 985研一学习日记 - 2024.11.14
  • 大数据新视界 -- 大数据大厂之 Impala 性能飞跃:动态分区调整的策略与方法(上)(21 / 30)
  • ubuntu-desktop-24.04上手指南(更新阿里源、安装ssh、安装chrome、设置固定IP、安装搜狗输入法)
  • 解决selenium爬虫被浏览器检测问题
  • 5. 条件 Conditionals
  • 56 mysql 用户权限相关的实现
  • Spring高手之路24——事务类型及传播行为实战指南
  • DHCP中继工作原理
  • 算法【Dijkstra算法及分层图最短路】
  • WPF实现关系图
  • Vue开发前端图片上传给java后端
  • MMD模型一键完美导入UE5-VRM4U插件方案(一)
  • 为什么三星、OPPO、红米都在用它?联发科12nm级射频芯片的深度剖析
  • Fyne ( go跨平台GUI )中文文档-入门(一)
  • Adobe预览今年晚些时候推出的AI视频工具
  • RAG技术全面解析:Langchain4j如何实现智能问答的跨越式进化?
  • 深入理解Vue3中style的scoped
  • 简单计算器(python基础代码撰写)
  • Vue3:具名插槽
  • 微信小程序07-开发进阶
  • c++难点核心笔记(一)
  • 基于SpringBoot+Vue的在线问诊管理系统
  • 【觅图网-注册安全分析报告-无验证方式导致安全隐患】