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. 【从翻译mos文章】在oracle db 11gR2版本号被启用 Oracle NUMA 支持

    在oracle db 11gR2版本号被启用 Oracle NUMA 支持 参考原始: Enable Oracle NUMA support with Oracle Server Version 11 ...

  2. DataContext和ItemSource

    一对多的关系DataContext为上下文,绑定数据源ItemSource取上下文中的某属性,会一级一级往上找属性 一般ItemSource的绑定,绑定到Grid/DataGrid一类容器上,底下的控 ...

  3. IIS文件目录

    IIS整体文件目录 C:\inetpub     默认网站Default Web Site添加网站也是把文件拷贝到该目录下,类比tomcat    

  4. SICP 1.29-1.33

    1.29 (define (sum term a next b) (if (> a b) (+ (term a) (sum term (next a) next b)))) (define (c ...

  5. __declspec的15种用法

    __cdecl和__stdcall都是函数调用规范(还有一个__fastcall),规定了参数出入栈的顺序和方法,如果只用VC编程的话可以不用关心,但是要在C++和Pascal等其他语言通信的时候就要 ...

  6. 图像滤镜艺术---LOMO Filter

    原文:图像滤镜艺术---LOMO Filter LOMO Filter LOMO是一种概念,即强调感受.机缘,弱化摄影技巧,不确定性和随意性是LOMO最大特点.LOMO源于Lomography,LOM ...

  7. 网络流量查看工具为 iftop

    作者: daodaoliang 时间: 2016年5月23日 版本: v0.0.1 邮箱: daodaoliang@yeah.net 日常用的网络流量查看工具为 iftop, 但是他仅仅只能简单的查看 ...

  8. OWIN 托管服务器问题:StartOptions WebApp.Start TargetInvocationException

    我有一个与OWIN托管的服务器有一个小问题.我试图让它可以访问本地网络,这意味着我不得不添加一些额外的选择: // Start OWIN host StartOptions options = new ...

  9. 1.预处理,生成预编译文件(.文件): Gcc –E hello.c –o hello.i 2.编译,生成汇编代码(.s文件): Gcc –S hello.i –o hello.s 3.汇编,生成目标文件(.o文件): Gcc –c hello.s –o hello.o 4.链接,生成可执行文件: linux笔记

    1 动态查看日志 tail -f filename tail -1000f filename 2 解压当前目录内容为xxx.zip  zip -r xxx.zip ./* 3 查看内存使用情况 fre ...

  10. UWP -- Background Task 深入解析

    原文:UWP -- Background Task 深入解析 1. 重点 锁屏问题 从 Windows 10 开始,用户无须再将你的应用添加到锁屏界面,即可利用后台任务,通用 Windows 应用必须 ...