Java线程池队列LinkedBlockingDeque

 更新时间:2022年12月11日 14:07:52   作者:刨红薯的小羊竿尔  
这篇文章主要为大家介绍了Java线程池队列LinkedBlockingDeque示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

public enum QueueTypeEnum {
    ARRAY_BLOCKING_QUEUE(1, "ArrayBlockingQueue"),
    LINKED_BLOCKING_QUEUE(2, "LinkedBlockingQueue"),
    DELAY_QUEUE(3, "DelayQueue"),
    PRIORITY_BLOCKING_QUEUE(4, "PriorityBlockingQueue"),
    SYNCHRONOUS_QUEUE(5, "SynchronousQueue"),
    LINKED_TRANSFER_QUEUE(6, "LinkedTransferQueue"),
    LINKED_BLOCKING_DEQUE(7, "LinkedBlockingDeque"),
    VARIABLE_LINKED_BLOCKING_QUEUE(8, "VariableLinkedBlockingQueue"),
    MEMORY_SAFE_LINKED_BLOCKING_QUEUE(9, "MemorySafeLinkedBlockingQueue");
}

LinkedBlockingDeque

LinkedBlockingDeque: 使用双向队列实现的有界双端阻塞队列。双端意味着可以像普通队列一样 FIFO(先进先出),也可以像栈一样 FILO(先进后出)。

LinkedBlockingDeque是一个基于链表的双端阻塞队列,和LinkedBlockingQueue类似,区别在于该类实现了Deque接口,而LinkedBlockingQueue实现了Queue接口。

LinkedBlockingDeque是一个可选容量的阻塞队列,如果没有设置容量,那么容量将是Int的最大值。

LinkedBlockingDeque的重要字段有如下几个:

//队列的头节点
transient Node<E> first;
//队列的尾节点
transient Node<E> last;
//队列中元素的个数
private transient int count;
//队列中元素的最大个数
private final int capacity;
//锁
final ReentrantLock lock = new ReentrantLock();
//队列为空时,阻塞take线程的条件队列
private final Condition notEmpty = lock.newCondition();
//队列满时,阻塞put线程的条件队列
private final Condition notFull = lock.newCondition();

从上面的字段,可以看到LinkedBlockingDeque内部只有一把锁以及该锁上关联的两个条件,所以可以推断同一时刻只有一个线程可以在队头或者队尾执行入队或出队操作。可以发现这点和LinkedBlockingQueue不同,LinkedBlockingQueue可以同时有两个线程在两端执行操作。

由于LinkedBlockingDeque是一个双端队列,所以就可以在队头执行入队和出队操作,也可以在队尾执行入队和出队操作。

public LinkedBlockingDeque() {
    this(Integer.MAX_VALUE);
}
public LinkedBlockingDeque(int capacity) {
    if (capacity <= 0) throw new IllegalArgumentException();
    this.capacity = capacity;
}
public LinkedBlockingDeque(Collection<? extends E> c) {
    this(Integer.MAX_VALUE);
    final ReentrantLock lock = this.lock;
    lock.lock(); // Never contended, but necessary for visibility
    try {
        for (E e : c) {
            if (e == null)
                throw new NullPointerException();
            if (!linkLast(new Node<E>(e)))
                throw new IllegalStateException("Deque full");
        }
    } finally {
        lock.unlock();
    }
}

LinkedBlockingDeque和LinkedBlockingQueue的区别

LinkedBlockingDeque和LinkedBlockingQueue的相同点在于:

  • 基于链表
  • 容量可选,不设置的话,就是Int的最大值

LinkedBlockingDeque和LinkedBlockingQueue的不同点在于:

  • 双端链表和单链表
  • 不存在哨兵节点
  • 一把锁+两个条件

以上就是Java线程池队列LinkedBlockingDeque的详细内容,更多关于Java线程池队列的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot+MinIO实现文件上传、读取、下载、删除的使用示例

    SpringBoot+MinIO实现文件上传、读取、下载、删除的使用示例

    本文主要介绍了SpringBoot+MinIO实现文件上传、读取、下载、删除的使用示例,详细介绍每个功能实现的步骤和代码示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • Java多线程实现之Executor详解

    Java多线程实现之Executor详解

    这篇文章主要介绍了Java多线程实现之Executor详解,Executor 给他一个 Runnable,他就能自动很安全的帮你把这个线程执行完毕
    Executor 通过创建线程池的方式来管理线程,需要的朋友可以参考下
    2023-08-08
  • 使用Zxing实现二维码生成器内嵌图片

    使用Zxing实现二维码生成器内嵌图片

    二维码在现实中的应用已经很广泛了,本文介绍了使用Zxing实现二维码生成器内嵌图片,有需要的可以了解一下。
    2016-10-10
  • Java由浅入深通关抽象类与接口下

    Java由浅入深通关抽象类与接口下

    在类中没有包含足够的信息来描绘一个具体的对象,这样的类称为抽象类,接口是Java中最重要的概念之一,它可以被理解为一种特殊的类,不同的是接口的成员没有执行体,是由全局常量和公共的抽象方法所组成,本文给大家介绍Java抽象类和接口,感兴趣的朋友一起看看吧
    2022-04-04
  • SpringBoot3集成Thymeleaf的过程详解

    SpringBoot3集成Thymeleaf的过程详解

    在现代的Web开发中,构建灵活、动态的用户界面是至关重要的,Spring Boot和Thymeleaf的结合为开发者提供了一种简单而强大的方式来创建动态的Web应用,本文将介绍如何在Spring Boot项目中集成Thymeleaf,并展示一些基本的使用方法,需要的朋友可以参考下
    2024-01-01
  • SpringMVC @RequestMapping注解属性详细介绍

    SpringMVC @RequestMapping注解属性详细介绍

    通过@RequestMapping注解可以定义不同的处理器映射规则,下面这篇文章主要给大家介绍了关于SpringMVC中@RequestMapping注解用法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Java线程的五种状态介绍

    Java线程的五种状态介绍

    本文主要为大家详细介绍一下Java实现线程创建的五种写法,文中的示例代码讲解详细,对我们学习有一定的帮助,感兴趣的可以跟随小编学习一下
    2022-08-08
  • Spring的实例工厂方法和静态工厂方法实例代码

    Spring的实例工厂方法和静态工厂方法实例代码

    这篇文章主要介绍了Spring的实例工厂方法和静态工厂方法实例代码,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java的SpringMVC中控制器返回XML数据问题

    Java的SpringMVC中控制器返回XML数据问题

    这篇文章主要介绍了Java的SpringMVC中控制器返回XML数据问题,控制器是处理HTTP请求的组件,它们接收来自客户端的请求,并将其转换为适当的响应,这些响应可以是动态生成的 HTML 页面,也可以是JSON或XML格式的数据,需要的朋友可以参考下
    2023-07-07
  • SpringBoot配置默认HikariCP数据源

    SpringBoot配置默认HikariCP数据源

    咱们开发项目的过程中用到很多的开源数据库链接池,比如druid、c3p0、BoneCP等等,本文主要介绍了SpringBoot配置默认HikariCP数据源,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11

最新评论