LinkedBlockingDeque是双向链表实现的阻塞队列。该阻塞队列同时支持FIFO和FILO两种操作方式,即可以从队列的头和尾同时操作(插入/删除);

在不能够插入元素时,它将阻塞住试图插入元素的线程;在不能够抽取元素时,它将阻塞住试图抽取的线程。;

LinkedBlockingDeque还是可选容量的,防止过度膨胀,默认等于Integer.MAX_VALUE。;

LinkedBlockingDueue没有进行读写锁的分离,因此同一时间只能有一个线程对其操作,因此在高并发应用中,它的性能要远远低于LinkedBlockingQueue。

具体代码:

import java.util.concurrent.LinkedBlockingDeque;

public class Main {
public static void main(String[] args) {
//给个3的队列
LinkedBlockingDeque<Integer> linkedBlockingDeque = new LinkedBlockingDeque<Integer>(3); //生产者
Producer firstProducer = new FirstProducer(linkedBlockingDeque);//头部插入
Producer lastProducer = new LastProducer(linkedBlockingDeque);//尾部插入
firstProducer.start();
// lastProducer.start(); //消费者
Consumer firstConsumer = new FirstConsumer(linkedBlockingDeque);//头部获取
Consumer lastConsumer = new LastConsumer(linkedBlockingDeque);//尾部获取
// firstConsumer.start();
lastConsumer.start(); }
}
import java.util.Random;
import java.util.concurrent.LinkedBlockingDeque; /**
* 生产者
*/
public abstract class Producer extends Thread{
protected LinkedBlockingDeque<Integer> linkedBlockingDeque;
public Producer(LinkedBlockingDeque<Integer> linkedBlockingDeque){
this.linkedBlockingDeque = linkedBlockingDeque;
} @Override
public void run() {
while(true){
int random = new Random().nextInt(1000);
try {
this.putQueue(random);//插入数据
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public abstract void putQueue(int random) throws InterruptedException;
}
import java.util.concurrent.LinkedBlockingDeque;

/**
* 头部插入
*/
public class FirstProducer extends Producer{
public FirstProducer(LinkedBlockingDeque<Integer> linkedBlockingDeque) {
super(linkedBlockingDeque);
} @Override
public void putQueue(int random) throws InterruptedException {
System.out.println("头部生产产品:"+random);
super.linkedBlockingDeque.putFirst(random);
System.out.println("头部生产产品:"+random+",结束");
}
}
import java.util.concurrent.LinkedBlockingDeque;

/**
* 尾部插入:默认是尾部插入
*/
public class LastProducer extends Producer{
public LastProducer(LinkedBlockingDeque<Integer> linkedBlockingDeque) {
super(linkedBlockingDeque);
} @Override
public void putQueue(int random) throws InterruptedException {
super.linkedBlockingDeque.putLast(random);
}
}
import java.util.concurrent.LinkedBlockingDeque;

/**
* 消费者
*/
public abstract class Consumer extends Thread{
protected LinkedBlockingDeque<Integer> linkedBlockingDeque;
public Consumer(LinkedBlockingDeque<Integer> linkedBlockingDeque){
this.linkedBlockingDeque = linkedBlockingDeque;
} @Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("------------------------------------");
while(true){
try {
System.out.println("尾部等待3秒开始获取产品");
Thread.sleep(3000);
this.takeQueue();//获取数据
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public abstract void takeQueue() throws InterruptedException;
}
import java.util.concurrent.LinkedBlockingDeque;

/**
* 头部获取
*/
public class FirstConsumer extends Consumer{
public FirstConsumer(LinkedBlockingDeque<Integer> linkedBlockingDeque) {
super(linkedBlockingDeque);
} @Override
public void takeQueue() throws InterruptedException {
System.out.println("头部获取产品开始");
Integer random = super.linkedBlockingDeque.takeFirst();
System.out.println("头部获取产品:"+random+",结束");
}
}
import java.util.concurrent.LinkedBlockingDeque;

/**
* 尾部获取
*/
public class LastConsumer extends Consumer{
public LastConsumer(LinkedBlockingDeque<Integer> linkedBlockingDeque) {
super(linkedBlockingDeque);
} @Override
public void takeQueue() throws InterruptedException {
Integer random = super.linkedBlockingDeque.takeLast();
System.out.println("尾部获取产品:"+random+",结束");
}
}

源码地址:https://github.com/qjm201000/concurrent_linkedBlockingDeque.git

并发编程-concurrent指南-阻塞双端队列-链阻塞双端队列LinkedBlockingDeque的更多相关文章

  1. 并发编程-concurrent指南-阻塞双端队列BlockingDeque

    java.util.concurrent 包里的 BlockingDeque 接口表示一个线程安放入和提取实例的双端队列. BlockingDeque 类是一个双端队列,在不能够插入元素时,它将阻塞住 ...

  2. 并发编程-concurrent指南-阻塞队列-链表阻塞队列LinkedBlockingQueue

    LinkedBlockingQueue是一个基于链表的阻塞队列. 由于LinkedBlockingQueue实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选. LinkedBlocki ...

  3. 并发编程-concurrent指南-阻塞队列BlockingQueue

    阻塞队列BlockingQueue,java.util.concurrent下的BlockingQueue接口表示一个线程放入和提取实例的队列. 适用场景: BlockingQueue通常用于一个线程 ...

  4. 深入理解java:2.3.4. 并发编程concurrent包 之容器ConcurrentLinkedQueue(非阻塞的并发队列---循环CAS)

    1.    引言 在并发编程中我们有时候需要使用线程安全的队列. 如果我们要实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,另一种是使用非阻塞算法. 使用阻塞算法的队列可以用一个锁(入队和出 ...

  5. 并发编程-concurrent指南-原子操作类-AtomicInteger

    在java并发编程中,会出现++,--等操作,但是这些不是原子性操作,这在线程安全上面就会出现相应的问题.因此java提供了相应类的原子性操作类. 1.AtomicInteger

  6. 并发编程-concurrent指南-阻塞队列-同步队列SynchronousQueue

    SynchronousQueue:同步Queue,属于线程安全的BlockingQueue的一种,此队列设计的理念类似于"单工模式",对于每个put/offer操作,必须等待一个t ...

  7. 并发编程-concurrent指南-阻塞队列-优先级的阻塞队列PriorityBlockingQueue

    PriorityBlockingQueue是一个支持优先级的无界阻塞队列. 它使用了和类 java.util.PriorityQueue 一样的排序规则.你无法向这个队列中插入 null 值. 所有插 ...

  8. 并发编程-concurrent指南-阻塞队列-数组阻塞队列ArrayBlockingQueue

    ArrayBlockingQueue类是实现了BlockingQueue. ArrayBlockingQueue是一个有界的阻塞队列,其内部实现是将对象放在一个数组中. 放入元素方法: (1) add ...

  9. 并发编程-concurrent指南-阻塞队列-延迟队列DelayQueue

    DelayQueue是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走.这种队列是有序的,即队头对象的延迟到期时间最长.注意:不能 ...

随机推荐

  1. Matlab随笔之插值与拟合(下)

    原文:Matlab随笔之插值与拟合(下) 1.二维插值之插值节点为网格节点 已知m x n个节点:(xi,yj,zij)(i=1…m,j=1…n),且xi,yi递增.求(x,y)处的插值z. Matl ...

  2. DataGridTemplateColumn

    DataGridTemplateColumn自定义单元格样式 <DataGrid Grid.Row="0" Name="BasicRuleDataGrid" ...

  3. WPF 4 TextBox 笔刷特效

    原文:WPF 4 TextBox 笔刷特效      TextBox 控件是我们开发过程中必不可少的组件,它可以使应用程序方便的与用户进行文字交互.在新WPF 4 中又为TextBox 添加了两种新笔 ...

  4. 【转载】MySQL和Keepalived高可用双主复制

    服务器主机IP和虚拟浮动IP配置 RealServer A 192.168.75.133 RealServer B 192.168.75.134 VIP A 192.168.75.110 VIP B ...

  5. WPF CommandParameter的使用

    <Window x:Class="Wpf180706.Window5"        xmlns="http://schemas.microsoft.com/win ...

  6. 向WPF的Grid里面增加控件

    在c#中,有时需要通过代码创建面板控件,但是对于面板的操作与之前的控件并不是很直观,因此记下方法,以供后来复习使用: 创建两行两列的表格: 第一种方法: Grid grid = new Grid(); ...

  7. qt5.9模块

    QAxContainer Module is a Windows-only extension for accessing ActiveX controls and COM objects 模块仅适用 ...

  8. SQL Server分页存储过程笔记

    USE [database] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[ProcedureN ...

  9. delphi 操作xml示例(DelphiBBS)

    自:http://www.delphibbs.com/keylife/iblog_show.asp?xid=20713 ======================================== ...

  10. 图像滤镜艺术---Glow Filter发光滤镜

    原文:图像滤镜艺术---Glow Filter发光滤镜 Glow Filter发光滤镜 Glow Filter发光滤镜是一种让图像产生发光效果的滤镜,它的实现算法如下: 1,对原图P进行高斯模糊得到图 ...