java中的阻塞队列

简介: java中的阻塞队列

今天开始在学习Java的阻塞队列,所以先进行一些了解

阻塞队列提供了可阻塞的put和take方法,以及支持定时的offer和poll方法。如果队列已经满了,那么put方法会阻塞到有可用空间;如果队列为空,take方法会一直阻塞到有可用元素。阻塞队列非常实用于生产者和消费者模式,当有数据生成时,生产者把数据放入队列,当消费者需要数据时,从队列中进行获取。而生产者不需要知道消费者的状态,同样消费者也不需要知道生产者的状态。当然消费者和生产者是相对的,假如生产者的速率大于消费者,那么当队列满了的时候,生产者可以转为消费者,将队列中的数据取出进行消费者的处理,这个道理同样适用于消费者。

下面来介绍阻塞队列的四种处理方式:

1.抛出异常,当调用add(e)方法将元素添加到队列中时,如果队列已经满了,则会抛出IllegalStateException;当调用remove(e)方法将元素从队列中移除时,如果指定的元素不存在时,则会抛出NullPointerException。当调用element()方法获取队列的头部时,如果队列为空,则会抛出NullPointerException。

2.特殊值,当调用offer(e)方法将元素插入到队列中时,如果该元素已经添加到该队列,则返回true,否则返回false;当调用poll()方法移除队列的头部时,返回被移除的队列头部;当调用peek()方法获取队列头部时,返回队列头部,如果队列为空,则返回null。

3.阻塞,即如前文介绍的put和take方法。

4.超时,当调用offer(e,time,unit)方法将指定元素插入到队列中,在插入之前等待以unit为单位的time超时时间,如果成功,返回true,如果超时,则返回false;当调用poll(time,unit)方法返回并且移除队列头部时,等待以unit为单位的time时间内的可用元素,如果成功,返回队列头部,如果超时,返回false。

接下来介绍几种常见的队列类型:

1.LinkedBlockingQueue:基于LinkedList的FIFO(first input,first out)的队列。

2.ArrayBlockingQueue:基于ArrayList的FIFO队列。

3.ProrityBlockingQueue:按照优先级排序的队列,可以按照元素的自然顺序或者元素实现的Comparable方式排序。

4.SynchronousQueue:实际上不是一个真正的队列,因为不会为队列中的元素进行维护,而它维护的是一组线程,这些线程在等待着把元素加入或者移除队列,它会直接将元素从生产者交付给消费者,而不需要一个中间件,从而会降低数据从生产者到消费者之间的延迟,但是该队列只适用于有足够多的消费者,并且总有一个消费者准备好获取交付的元素时的场合。

一些队列的基础知识介绍就到此,接下来会进入到更深入的了解方式。

相关文章
|
6月前
|
存储 安全 Java
Java线程池ThreadPoolExcutor源码解读详解02-阻塞队列之ArrayBlockingQueue
`ArrayBlockingQueue` 是Java中一个基于数组的并发队列,具有线程安全的性质。以下是其关键信息的摘要: - **继承实现关系**:它扩展了`AbstractQueue`并实现了`BlockingQueue`接口,确保线程安全的入队和出队操作。 - **数据结构**:内部由固定大小的数组支撑,有`takeIndex`和`putIndex`跟踪元素的添加和移除位置,`count`记录队列中的元素数量。 - **特点**:队列长度在创建时必须指定且不可变,遵循先进先出(FIFO)原则,当队列满时,添加元素会阻塞,空时,移除元素会阻塞。
71 0
|
3月前
|
存储 监控 安全
一天十道Java面试题----第三天(对线程安全的理解------>线程池中阻塞队列的作用)
这篇文章是Java面试第三天的笔记,讨论了线程安全、Thread与Runnable的区别、守护线程、ThreadLocal原理及内存泄漏问题、并发并行串行的概念、并发三大特性、线程池的使用原因和解释、线程池处理流程,以及线程池中阻塞队列的作用和设计考虑。
|
3月前
|
存储 安全 Java
从基础到实战:如何用 Java 手写一个阻塞队列?
大家好,我是小米!今天分享手写阻塞队列(Blocking Queue)教程,深入讲解并发编程中的 wait() 和 notifyAll() 机制,通过代码实战,让你轻松掌握生产者-消费者模型中的阻塞队列实现!
106 0
|
5月前
|
存储 Java API
java线程之阻塞队列
java线程之阻塞队列
|
5月前
|
存储 缓存 Java
Java 中的阻塞队列
Java 中的阻塞队列
28 0
|
6月前
|
存储 安全 Java
Java多线程基础-9:代码案例之阻塞队列(二)
Java多线程基础教程系列中,介绍了如何实现一个简单的阻塞队列(非泛型版本)。
56 0
|
6月前
|
消息中间件 存储 负载均衡
Java多线程基础-9:代码案例之阻塞队列(一)
阻塞队列是一种遵循先进先出原则的线程安全数据结构,它在队列满时会阻塞入队操作,队列空时会阻塞出队操作,常用于多线程间的协作,简化同步代码编写。Java中提供了`BlockingQueue`接口及其实现类,如`ArrayBlockingQueue`和`LinkedBlockingQueue`,用于实现生产者-消费者模型,以实现负载均衡和资源的有效利用,如削峰填谷,降低系统压力。
77 0
|
6月前
|
设计模式 消息中间件 安全
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
53 0
|
6月前
|
存储 安全 Java
Java线程池ThreadPoolExcutor源码解读详解08-阻塞队列之LinkedBlockingDeque
**摘要:** 本文分析了Java中的LinkedBlockingDeque,它是一个基于链表实现的双端阻塞队列,具有并发安全性。LinkedBlockingDeque可以作为有界队列使用,容量由构造函数指定,默认为Integer.MAX_VALUE。队列操作包括在头部和尾部的插入与删除,这些操作由锁和Condition来保证线程安全。例如,`linkFirst()`和`linkLast()`用于在队首和队尾插入元素,而`unlinkFirst()`和`unlinkLast()`则用于删除首尾元素。队列的插入和删除方法根据队列是否满或空,可能会阻塞或唤醒等待的线程,这些操作通过`notFul
316 5
|
6月前
|
存储 安全 Java
Java线程池ThreadPoolExcutor源码解读详解07-阻塞队列之LinkedTransferQueue
`LinkedTransferQueue`是一个基于链表结构的无界并发队列,实现了`TransferQueue`接口,它使用预占模式来协调生产者和消费者的交互。队列中的元素分为数据节点(isData为true)和请求节点(isData为false)。在不同情况下,队列提供四种操作模式:NOW(立即返回,不阻塞),ASYNC(异步,不阻塞,但后续线程可能阻塞),SYNC(同步,阻塞直到匹配),TIMED(超时等待,可能返回)。 `xfer`方法是队列的核心,它处理元素的转移过程。方法内部通过循环和CAS(Compare And Swap)操作来确保线程安全,同时避免锁的使用以提高性能。当找到匹
291 5