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

java 并发编程-阻塞队列

阻塞队列

  • 接口Queue
  • 接口BlockingQueue
  • ArrayBlockingQueue
  • LinkedBlockingDeque
  • SynchronousQueue
  • PriorityBlockingQueue
  • DelayQueue

接口Queue

在这里插入图片描述

接口BlockingQueue

阻塞队列(BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。
在这里插入图片描述

ArrayBlockingQueue

ArrayBlockingQueue使用独占锁ReentrantLock实现线程安全,入队和出队操作使用同一个锁对象。使用两个Condition-notFull和notEmpty来实现队列阻塞。
在这里插入图片描述
在这里插入图片描述

public static void main(String[] args) {
        ArrayBlockingQueue<Integer> arrayBlockingQueue = new ArrayBlockingQueue<>(3);

        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0; i < 10; i++) {
                    try {
                        Thread.sleep(1000);
                        arrayBlockingQueue.put(i);
                        System.out.println("往队列添加元素:" + i);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    Integer take = null;
                    try {
                        Thread.sleep(2000);
                        take = arrayBlockingQueue.take();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    System.out.println("从队列拿出元素:" + take);
                }
            }
        }).start();
    }

LinkedBlockingDeque

LinkedBlockingQueue是一个基于链表实现的阻塞队列,默认情况下,该阻塞队列的大小为Integer.MAX_VALUE。为了避免队列过大造成机器负载或者内存爆满的情况出现,我们在使用的时候建议手动传一个队列的大小。LinkedBlockingQueue写入取出使用两把锁,删除时两把锁同时加锁。也是是用两个Condition实现阻塞。

SynchronousQueue

SynchronousQueue是一个没有数据缓冲的BlockingQueue,它的容量为0,生产者线程对其的插入操作put必须等待消费者的移除操作take。

PriorityBlockingQueue

PriorityBlockingQueue是一个无界的基于数组的优先级阻塞队列,队列中每个元素都有一个优先级,出队的时候,优先级最高的先出。

DelayQueue

DelayQueue是一个支持延时获取元素的阻塞队列,内部采用优先队列PriorityQueue存储元素,同时元素必须实现Delayed接口;在创建元素时可以指定多久才可以从队列中获取当前元素,只有在延迟期满时才能从队列中提取元素。
延迟队列的特点是:不是先进先出,而是会按照延迟时间的长短来排序,下一个即将执行的任务会排到队列的最前面。
在这里插入图片描述

public class Main {
    public static void main(String[] args) {
        DelayQueue<Order> delayQueue = new DelayQueue<>();
        delayQueue.put(new Order("order1", System.currentTimeMillis(), 5000));
        delayQueue.put(new Order("order2", System.currentTimeMillis(), 3000));
        delayQueue.put(new Order("order3", System.currentTimeMillis(), 2000));
        
        while (!delayQueue.isEmpty()) {
            try {
                Order take = delayQueue.take();
                System.out.println("出队订单:" + take.orderId);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

    static class Order implements Delayed {

        private String orderId;
        private long createTime;
        private long delayTIme;

        public Order(String orderId, long createTime, long delayTIme) {
            this.orderId = orderId;
            this.createTime = createTime;
            this.delayTIme = delayTIme;
        }

        @Override
        public long getDelay(TimeUnit unit) {
            long diff = createTime + delayTIme - System.currentTimeMillis();
            return unit.convert(diff, TimeUnit.MICROSECONDS);
        }

        @Override
        public int compareTo(Delayed o) {
            long diff = this.getDelay(TimeUnit.MICROSECONDS) - o.getDelay(TimeUnit.MICROSECONDS);
            return Long.compare(diff, 0);
        }
    }
}
http://www.dtcms.com/a/109694.html

相关文章:

  • 升级到oracle 19.8后vm_concat函数不可用怎么解决
  • 网络空间安全(51)邮件函数漏洞
  • DeepSeek技术原理解读:从算法革新到产业变革
  • 【大模型基础_毛玉仁】6.4 生成增强
  • 【Spring AOP】@Aspect、 @Pointcut使用@annotation + 五种通知Advice注解
  • AI爬虫?爬!
  • Python入门(7):模块
  • 事件处理程序
  • 主题(topic)中使用键(key)来区分同一主题下的多个数据实例
  • 风云可测:华为AI天气大模型将暴雨预测误差缩至3公里内
  • ctfshow VIP题目限免 前台JS绕过
  • Oracle中的UNION原理
  • 【7】数据结构的队列篇章
  • 在Vue中如何高效管理组件状态
  • Swift 继承
  • Java 大数据在智能安防入侵检测系统中的多源数据融合与分析技术(171)
  • FreeRtos简介
  • LLM架构解析:词嵌入模型 Word Embeddings(第二部分)—— 从基础原理到实践应用的深度探索
  • vscode 使用ssh进行远程开发 (remote-ssh)
  • 【2】搭建k8s集群系列(二进制)之安装etcd数据库集群
  • MySQL学习笔记集--DML
  • 【北京化工大学】 神经网络与深度学习 实验6 MATAR图像分类
  • JeecgBoot AI 应用开发平台,AIGC 功能介绍
  • MCP服务器搜索引擎有哪些?MCP资源网站推荐
  • IdeaVim-AceJump
  • 【Mysql】之存储引擎详解
  • 【UVM学习笔记】更加灵活的UVM—通信
  • oracle asm 相关命令和查询视图
  • 本地部署爆款传输神器 FastSend 并实现外部访问
  • 智能巡检机器人在化工企业的应用研究