微信公众号文章列表:关注公众号(coding_song)阅读更清晰,附件为微信二维码
Queue
队列接口,是一个为在处理前保存元素而设计的集合
Queue接口方法
add(E e)
:向集合中添加一个元素,如果是容量受限的队列(有界队列),当队列已满后,继续向队列中添加元素,将会抛异常,添加成功后,返回trueoffer(E e)
:向集合中添加一个元素,如果是容量受限的队列(有界队列),当队列已满后,继续向队列中添加元素,将会返回false,否则返回true
remove()
:获取并删除队列中的头元素,当队列为空时,调用此方法,将会抛出异常,删除成功后,返回被删除的元素对象poll()
:获取并删除队列中的头元素,当队列为空时,返回null,否则返回被删除的元素对象element()
:获取队列中的头元素,当队列为空时,将抛出异常,否则返回队列的头元素peek()
:获取队列中的头元素,当队列为空时,返回null,否则返回队列的头元素
BlockingQueue
阻塞队列接口,继承Queue接口,阻塞队列中的方法有4中形式,1)直接抛出一个异常;2)返回一个特定的值null或false等;3)无限期阻塞当前线程直到满足条件才继续后续操作;4)在给定的最大时间限制内阻塞;阻塞队列中的所有实现都是线程安全的,如果队列中没有元素,当获取队列中的元素时,将会一直阻塞,直到队列中有值后,才会返回元素内容;当向队列中添加元素时,如果队列已满,将会一直阻塞,直到队列中有空间时,才会将元素添加到队列中;
BlockingQueue接口方法
put(E e)
:向队列中添加元素,当队列已满时,将会一直阻塞,直到队列有空间时,才会成功将数据添加到队列中offer(E e,long timeout,TimeUnit unit)
:将指定的元素插入到队列中,如有必要,等待指定的等待时间以使空间可用,在timeout时间后,如果队列中还是没有空间可用,将会抛出异常take()
:获取并移除头元素,当队列中没有元素时,将会一直阻塞,直到有元素时,将会移除队列的头元素poll(long timeout,TimeUnit unit)
:检索并删除此队列的头元素,如果需要,可等待指定的等待时间以使元素可用drainTo(Collection<?superE> c)
:移除队列中的所有元素,并将这些元素添加到给定的集合中
Queue实现类
无界队列
:PriorityBlockingQueue、ConcurrentLinkedQueue有界队列
:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue阻塞队列
:ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue
阻塞队列实现类PriorityBlockingQueue、ArrayBlockingQueue、LinkedBlockingQueue等都是线程安全的,内部调用ReentrantLock的lock或lockInterruptibly方法进行加锁,等待逻辑执行完成后,使用调用unlock释放锁
PriorityBlockingQueue
:是一个使用与类PriorityQueue相同的排序规则并提供阻塞检索操作的无边界阻塞优先级队列,优先级队列不允许使用null元素,依赖自然排序的优先级队列不允许插入不能比较的对象ConcurrentLinkedQueue
:是一个基于链表节点的、线程安全的无界队列,遵循先进先出规则,队列中的头元素是队列中时间最长的元素,尾元素是队列中时间最短的元素;添加元素时,从队列尾添加元素,读取元素时,从队列的头读取元素;当多个线程需要共享一个集合时,可以使用ConcurrentLinkedQueue来保存集合,此集合不允许使用null元素ArrayBlockingQueue
:是一个由数组组成的有界阻塞队列,此队列遵循先进先出的原则,队列中的头元素是队列中时间最长的元素,尾元素是队列中时间最短的元素;添加元素时,从队列尾添加元素,读取元素时,从队列的头读取元素;这是一个景点的有界缓冲队列,是一个有生产者添加数据、消费者读取数据的固定大小的数组;一旦创建好ArrayBlockingQueue,其容量大小不可改变LinkedBlockingQueue
:是一个基于链接节点的、大小可选的有界阻塞队列,此队列遵循先进先出原则,队列中的头元素是队列中时间最长的元素,尾元素是队列中时间最短的元素;添加元素时,从队列尾添加元素,读取元素时,从队列的头读取元素;此队列比ArrayBlockingQueue具有更高的吞吐量,但其性能不好预测SynchronousQueue
:阻塞队列,其中每个put/offer操作必须等待另一个线程执行相应的take/poll操作,反之亦然;其内部没有数据缓存空间,不用来保存数据;数据是在配对的生产者和消费者线程之间直接传递的,并不会将数据缓冲数据到队列中,使用示例如下
-
publicstaticvoid main(String[] args)throwsInterruptedException{
-
SynchronousQueue queue =newSynchronousQueue();
-
Runnable offer =()->{
-
try{
-
queue.offer(1,1000,TimeUnit.MILLISECONDS);
-
}catch(InterruptedException e){
-
e.printStackTrace();
-
}
-
};
-
Runnable poll =()->System.out.println("test SynchronousQueue:" + queue.poll());
-
newThread(offer).start();
-
Thread.sleep(1000);
-
newThread(poll).start();
-
}
创建offer生产者线程和poll消费者线程,然后启动两个线程,最终生产者线程将数据传递给消费者线程,打印结果为:testSynchronousQueue:1
推荐阅读:回首过往、展望未来
扫码关注获取更多文章
相关推荐
在这个主题中,我们将深入探讨Java实现的三种基本数据结构:堆栈(Stack)、队列(Queue)和列表(List)。这些概念是计算机科学的核心部分,对理解和解决复杂问题至关重要。 1. **堆栈(Stack)**: - 堆栈是一种...
- `QueueEmpty(LinkQueue)`:判断队列是否为空。 - `Value(person&, char Name[])`:根据名字获取成员信息。 - `AddNewNode(person&)`:添加新成员到家族树中。 - `EnQueue(LinkQueue&, QElemType)`:队列入队操作。...
2. **Logix5000系列**:Logix5000是Rockwell Automation开发的控制器家族,包括了ControlLogix、MicroLogix和CompactLogix等不同级别的PLC。该系列提供了丰富的功能和模块化设计,可以满足从简单到复杂的自动化任务...
本知识点将详细介绍MQ的基本概念、主要特点、工作原理、队列管理器、通道以及消息序列号等相关知识。 首先,MQSeries是IBM推出的一套消息处理产品,它支持多种操作系统平台和网络协议,能够实现异步消息传递,保证...
本文将深入探讨XL710家族驱动的关键组件——admin queue(管理队列)命令及其在i40e_adminq_cmd.c源代码中的实现。 Intel Ethernet Controller XL710是Intel推出的一款100Gbps以太网控制器,它支持PCI Express 3.0...
- **队列(Queues)**: 包含队列家族属性(Queue Family Properties)、队列创建(Queue Creation)、队列家族索引(Queue Family Index)、队列优先级(Queue Priority)和队列同步(Queue Synchronization)等方面的内容。...
Arduino MKR WiFi 1010是Arduino家族的一款强大的开发板,具有内置的Wi-Fi功能,能够轻松连接到互联网。它基于低功耗微处理器SAMD21,适合需要无线连接的IoT项目。在这个队列管理系统中,Arduino作为核心控制器,...
- **死信队列(Dead Letter Queue)**:当消息无法投递或超时未被消费时,可以发送到死信队列进行处理。 - **消息确认(Message Acknowledgments)**:消费者确认收到消息后,RabbitMQ会删除消息,确保消息至少被...
5. **消息队列服务**:如Amazon Simple Notification Service (SNS) 和Simple Queue Service (SQS),用于异步处理消息,提高系统的响应性和可靠性。 6. **日志和监控工具**:例如CloudWatch、Prometheus等,帮助...
队列家族(Queue Families)定义了设备可以执行的不同类型的操作,如图形处理、计算或传输。 3. **命令缓冲区(Command Buffers)**:Vulkan使用命令缓冲区来记录要执行的操作序列。命令缓冲区分为即时(Immediate...
2. **队列管理器(Queue Manager)**:队列管理器是IBM MQ的核心组件,负责管理消息的存储、路由和传输。每个队列管理器可以拥有多个队列和通道。 3. **队列和话题(Queues and Topics)**:队列用于存储和传递消息...
1. **WebSphere MQ基本概念**:WebSphere MQ的核心概念包括队列(Queue)和队列管理器(Queue Manager)。队列是存储和转发消息的实体,而队列管理器则负责管理和调度这些队列,确保消息的正确发送和接收。 2. **...
同时,队列(Queues)的家族属性(Queue Family Properties)、创建(Queue Creation)、优先级(Queue Priority)和同步(Queue Synchronization)也是理解和正确使用Vulkan的关键。 7. 命令缓冲区(Command ...
在Linux系统中,Intel的i40e_adminq驱动程序是针对XL710家族设备的VF驱动,它实现了VF与Physical Function (PF) 之间的通信。VF是一种硬件资源分割技术,允许一个物理网卡被划分为多个独立的逻辑网卡,每个VF都可以...
RabbitMQ核心API、高级特性、整合Spring家族、集群模式、SET化架构设计、组件架构 带你全面系统掌握RabbitMQ及Java访问操作!pom.xml 2 概述 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现...
程序的整个生命周期通过"逻辑设备"来管理,其中涉及到选择物理设备、确定队列家族和创建设备队列。此外,Vulkan支持多平台开发,包括Windows、Linux和MacOS,并且对开发环境有着严格的要求。开发人员需要安装Vulkan ...
WebSphere MQ(Message Queue)是由IBM公司开发的一款消息中间件产品,用于实现分布式应用程序间的可靠消息传递。它为跨平台、跨网络的应用提供了强大的消息处理能力,能够支持异步通信模式,确保消息的正确发送与...
数据结构方面,提到了数组栈(ArrayStacks)、链表栈(LinkedStacks)以及循环数组队列(CircularArrayQueue)。栈是一种后进先出(LIFO)的数据结构,而队列是一种先进先出(FIFO)的数据结构。这两种数据结构对于...
2. **虚拟化技术**:VF是SR-IOV技术的一部分,每个VF具有自己的队列对(queue pairs),可以独立配置和管理,提供给VM直接访问,从而减少I/O虚拟化层的性能损耗。 3. **Linux VF驱动的作用**:VF驱动负责初始化和...