BlockQueue提供的相关操作和特点:
方法/处理方式
|
抛出异常 |
返回特殊值
|
一直阻塞
|
超时退出
|
插入
|
add(e)
|
offer(e)
|
put(e)
|
offer(e,time,unit)
|
删除 |
remove()
|
poll() |
take()
|
poll(time,unit)
|
检查 |
element()
|
peek()
|
无 |
无
|
ArrayBlockingQueue
|
数组实现的有界阻塞队列
|
LinkedBlockingQueue
|
链表实现的有界阻塞队列
|
PriorityBlockingQueue
|
支持优先级排序的无界阻塞队列 |
DelayQueue
|
优先级队列实现的无界阻塞队列
|
SynchronousQueue
|
不存储元素的阻塞队列
|
LinkedTransferQueue
|
链表实现的无界阻塞队列 |
LinkedBlockingDeque
|
链表实现的双向阻塞队列 |
ArrayBlockingQueue 源码分析:
1 add(e)
public boolean add(E e) { if (offer(e)) return true; else throw new IllegalStateException("Queue full"); }
offer 插入成功后返回false,如果不成功说明队列已满,抛出异常。
2 offer(e)
public boolean offer(E e) { checkNotNull(e); final ReentrantLock lock = this.lock; lock.lock(); try { if (count == items.length) return false; else { enqueue(e); return true; } } finally { lock.unlock(); } }
如果e为空抛出空指针异常,先获得锁,如果队列已满返回false,否则加入队列。
private void enqueue(E x) { // assert lock.getHoldCount() == 1; // assert items[putIndex] == null; final Object[] items = this.items; items[putIndex] = x; if (++putIndex == items.length) putIndex = 0; count++; notEmpty.signal(); }
一开始putIndex = 0,0赋值之后,和length,即创建队列制定的长度比对,相等说明队列满了,count为实际元素的个数,触发队列不为空事件。
3 put(e)
public void put(E e) throws InterruptedException { checkNotNull(e); final ReentrantLock lock = this.lock; lock.lockInterruptibly(); try { while (count == items.length) notFull.await(); enqueue(e); } finally { lock.unlock(); } }
当队列已满时,等待。 其他操作类似。
相关推荐
综上所述,JDK 1.8 API文档英文版是Java开发者不可或缺的参考资料,它不仅包含了Java 1.8的所有核心功能,还介绍了新的特性和改进,帮助开发者更好地理解和利用这个强大的平台进行软件开发。在遇到中文解释不准确的...
标题“Multi person chat_jdk1.8_java编程_”表明我们将探讨一个基于Java 1.8(也称为JDK 1.8)的多人聊天应用程序的实现。描述中提到使用IntelliJ IDEA(一个流行的Java开发集成环境)来构建这个应用,并且利用多...
**JDK API 1.8** 是Java开发工具包(Java Development Kit)的一个版本,它包含了Java编程语言的核心库,是开发和运行Java程序的基础。这个API文档详细地阐述了这些核心库中的类、接口、枚举和注解,为开发者提供了...
Java API 1.8,也称为Java Development Kit (JDK) 8,是Java编程语言的核心组成部分,为开发者提供了丰富的类库和接口,使得开发者能够构建功能强大的应用程序和服务器端系统。这个API文档详细列出了Java 8中的所有...
《Java开发工具包(JDK)API 1.8中文版》是Java开发者的重要参考资料,它详尽地列出了Java 1.8版本中的各种类、接口、方法和异常等核心组件,为开发者提供了全面的编程指南。这个CHM文件不仅包含了中文版的API文档,...
ArrayBlockingQueue是基于jdk1.8进行分析的阻塞队列实现。阻塞队列是一个传统的有界队列,在这个有界队列里,一个固定大小的数组用来保存生产者产生的元素和消费者获取的元素。一旦创建,大小不可改变。往已满的队列...
【标签】"jdk1.8" 指出这个项目是基于Java Development Kit的第8个主要版本进行开发的。JDK 1.8是Java的一个重要里程碑,引入了许多新特性,比如 Lambda 表达式、Stream API、新的日期和时间API等。因此,MyChat可能...
在JDK1.8中,当`HashMap`的一个桶内元素超过8个时,会从链表转为红黑树,以降低查找、插入和删除的时间复杂度,从O(n)降低到O(log n)。 ### 8. `ConcurrentHashMap`在JDK1.8的改进 - 分段锁改为CAS和Synchronized相...
9. **并发安全的HashMap**:在并发环境下,使用`ConcurrentHashMap`,JDK1.7中基于锁分段技术,JDK1.8中改为使用CAS(Compare and Swap)无锁算法和分段锁,进一步提高了并发性能。 10. **ConcurrentHashMap的实现*...
一、语言及软件环境:Java、Windows 11, JDK1.8,IntelliJ IDEA 二、课程设计内容和要求: 1、提交一批作业(>=10),按先来先服选择一部分作业(最多5个)进入内存。 2、为每个作业创建一个进程,并分配内存(用户...
BlockingQueue 是一种阻塞队列,提供了阻塞式的添加和删除操作。 在Queue中poll()和remove()有什么区别 在Queue中poll()和remove()有什么区别?poll() 方法返回队列的头元素,如果队列为空,则返回null,remove() ...
4. **JDK 1.8 新特性**: - 接口的默认方法和静态方法:允许接口中有实现的非抽象方法,使用`default`关键字,静态方法则无需实例化接口就能调用。 - Lambda表达式:提供了一种简洁的匿名函数写法,简化了函数式...
JDK1.8后,当链表长度超过8,会转为红黑树以优化查找性能。 4. **I/O多路复用:epoll与poll**: - **select**:轮询检查所有文件描述符,效率较低,适合少量文件描述符的情况。 - **epoll**:采用事件驱动,当有I...
还有`java.util.concurrent`包中的各种并发工具类,如`Semaphore`(信号量)用于限制同时访问特定资源的线程数量,`BlockingQueue`(阻塞队列)用于线程间通信等。 此外,Java的并发工具包JUC(Java Concurrency ...
JDK1.8以后,当链表长度达到8时,链表会转换为红黑树以提高查找性能。 4. **epoll与poll的区别**: - **poll**和**epoll**都是I/O多路复用技术。poll采用轮询方式检查每个socket是否有事件发生,而epoll则使用回调...
随着Java的发展,Fork/Join框架在JDK1.8版本之后也得到了进一步的优化。这些优化包括提高了性能、改进了算法以及提供了一些新的功能,以支持更加复杂的并行计算任务。 在了解Fork/Join框架的设计思路时,阅读Doug ...