`
edgar108
  • 浏览: 33431 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

java阻塞队列介绍(jdk 1.8)

    博客分类:
  • java
 
阅读更多

 

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文档英文版

    综上所述,JDK 1.8 API文档英文版是Java开发者不可或缺的参考资料,它不仅包含了Java 1.8的所有核心功能,还介绍了新的特性和改进,帮助开发者更好地理解和利用这个强大的平台进行软件开发。在遇到中文解释不准确的...

    Multi person chat_jdk1.8_java编程_

    标题“Multi person chat_jdk1.8_java编程_”表明我们将探讨一个基于Java 1.8(也称为JDK 1.8)的多人聊天应用程序的实现。描述中提到使用IntelliJ IDEA(一个流行的Java开发集成环境)来构建这个应用,并且利用多...

    JDK_API_1.8

    **JDK API 1.8** 是Java开发工具包(Java Development Kit)的一个版本,它包含了Java编程语言的核心库,是开发和运行Java程序的基础。这个API文档详细地阐述了这些核心库中的类、接口、枚举和注解,为开发者提供了...

    JDK API 1.8.zip

    Java API 1.8,也称为Java Development Kit (JDK) 8,是Java编程语言的核心组成部分,为开发者提供了丰富的类库和接口,使得开发者能够构建功能强大的应用程序和服务器端系统。这个API文档详细列出了Java 8中的所有...

    jdk api 1.8.CHM 中文版

    《Java开发工具包(JDK)API 1.8中文版》是Java开发者的重要参考资料,它详尽地列出了Java 1.8版本中的各种类、接口、方法和异常等核心组件,为开发者提供了全面的编程指南。这个CHM文件不仅包含了中文版的API文档,...

    Java源码解析阻塞队列ArrayBlockingQueue功能简介

    ArrayBlockingQueue是基于jdk1.8进行分析的阻塞队列实现。阻塞队列是一个传统的有界队列,在这个有界队列里,一个固定大小的数组用来保存生产者产生的元素和消费者获取的元素。一旦创建,大小不可改变。往已满的队列...

    MyChatV1.0.zip

    【标签】"jdk1.8" 指出这个项目是基于Java Development Kit的第8个主要版本进行开发的。JDK 1.8是Java的一个重要里程碑,引入了许多新特性,比如 Lambda 表达式、Stream API、新的日期和时间API等。因此,MyChat可能...

    java面试精华11

    在JDK1.8中,当`HashMap`的一个桶内元素超过8个时,会从链表转为红黑树,以降低查找、插入和删除的时间复杂度,从O(n)降低到O(log n)。 ### 8. `ConcurrentHashMap`在JDK1.8的改进 - 分段锁改为CAS和Synchronized相...

    Java面试题集合部分.docx

    9. **并发安全的HashMap**:在并发环境下,使用`ConcurrentHashMap`,JDK1.7中基于锁分段技术,JDK1.8中改为使用CAS(Compare and Swap)无锁算法和分段锁,进一步提高了并发性能。 10. **ConcurrentHashMap的实现*...

    2022年广工操作系统课程设计(源代码+课设报告)(Java版)

    一、语言及软件环境:Java、Windows 11, JDK1.8,IntelliJ IDEA 二、课程设计内容和要求: 1、提交一批作业(>=10),按先来先服选择一部分作业(最多5个)进入内存。 2、为每个作业创建一个进程,并分配内存(用户...

    Java集合容器面试题

    BlockingQueue 是一种阻塞队列,提供了阻塞式的添加和删除操作。 在Queue中poll()和remove()有什么区别 在Queue中poll()和remove()有什么区别?poll() 方法返回队列的头元素,如果队列为空,则返回null,remove() ...

    2018中级java工程师面试总结

    4. **JDK 1.8 新特性**: - 接口的默认方法和静态方法:允许接口中有实现的非抽象方法,使用`default`关键字,静态方法则无需实例化接口就能调用。 - Lambda表达式:提供了一种简洁的匿名函数写法,简化了函数式...

    金融支付大厂JAVA资深工程师面试真题

    JDK1.8后,当链表长度超过8,会转为红黑树以优化查找性能。 4. **I/O多路复用:epoll与poll**: - **select**:轮询检查所有文件描述符,效率较低,适合少量文件描述符的情况。 - **epoll**:采用事件驱动,当有I...

    安琪拉教百里守约学并发编程之多线程基础

    还有`java.util.concurrent`包中的各种并发工具类,如`Semaphore`(信号量)用于限制同时访问特定资源的线程数量,`BlockingQueue`(阻塞队列)用于线程间通信等。 此外,Java的并发工具包JUC(Java Concurrency ...

    互联网大厂Java资深工程师岗位面试真题

    JDK1.8以后,当链表长度达到8时,链表会转换为红黑树以提高查找性能。 4. **epoll与poll的区别**: - **poll**和**epoll**都是I/O多路复用技术。poll采用轮询方式检查每个socket是否有事件发生,而epoll则使用回调...

    java Fork Join框架及使用

    随着Java的发展,Fork/Join框架在JDK1.8版本之后也得到了进一步的优化。这些优化包括提高了性能、改进了算法以及提供了一些新的功能,以支持更加复杂的并行计算任务。 在了解Fork/Join框架的设计思路时,阅读Doug ...

Global site tag (gtag.js) - Google Analytics