Java concurrent 包中BlockingQueue接口有ArrayBlockingqueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousBlockingQueue等几个实现类。

1、ArrayBlockingqueue

通过名字可以看出,ArrayBlockingqueue是通过数组实现的定长队列,遵循FIFO(先进先出)原则,队列头部元素位于队列中的时间最长,队列尾部的元素位于队列中的时间最短。新到的元素放入队列尾部,取元素时从头部取。

队列一旦初始化后,大小就确定了。队列满了后再向其中添加元素就会阻塞队列。同理,向空的队列取元素也会发生阻塞。

2、LinkedBlockingQueue

该队列自然是通过链表实现的,与ArrayBlockingQueue不同的是,该队列是基于链表节点实现,节点动态生成,队列默认最大长度是整数型变量最大值,即231-1,可以通过构造方法自己指定队列的长度。由于LinkedBlockingQueue生产和消费数据分别采用独立的锁,所以在高并发情况下,其吞吐量要高于ArrayBlockingQueue,但在大多数应用中,其可预知的性能要低。

3、PriorityBlockingQueue

该队列中的元素是按顺序结构存储中,添加到队列中的元素必须实现Comparable接口的compareTo()方法。在向队列中添加元素时,会与原队列中的元素进行比较,直到找到它的位置。该队列不允许null值。

4、SynchronousBlockingQueue

对于SynchronousBlockingQueue来说,入队和出队操作是交替进行的,也就是说一个线程进行insert操作后,必须等待另一个线程进行remove操作才能再次进行insert操作,反之亦然。

下面是一个用LinkedBlockingQueue关于生产者和消费者一个例子:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue; public class BlockingQueue {
private static LinkedBlockingQueue<Integer> linkedBlockingQueue = new LinkedBlockingQueue<Integer>(); public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(new Producer("producer 1"));
executorService.submit(new Producer("producer 2"));
executorService.submit(new Producer("producer 3")); executorService.submit(new Consumer("consumer 1"));
executorService.submit(new Consumer("consumer 2"));
executorService.submit(new Consumer("consumer 3")); } static class Producer implements Runnable{
private String name;
public Producer(String name){
this.name = name;
} @Override
public void run() {
for(Integer i=0;i<10;i++){
System.out.println(this.name + " produce " + i);
linkedBlockingQueue.add(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
} static class Consumer implements Runnable{
private String name;
public Consumer(String name){
this.name=name;
}
@Override
public void run() {
for(Integer i=0;i<10;i++){
try {
System.out.println(this.name + " consume " + linkedBlockingQueue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
} }
												

Java并发编程-阻塞队列的更多相关文章

  1. Java并发编程-阻塞队列(BlockingQueue)的实现原理

    背景:总结JUC下面的阻塞队列的实现,很方便写生产者消费者模式. 常用操作方法 常用的实现类 ArrayBlockingQueue DelayQueue LinkedBlockingQueue Pri ...

  2. Java并发编程——阻塞队列BlockingQueue

    Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...

  3. java并发编程阻塞队列

    在前面我们接触的队列都是非阻塞队列,比如PriorityQueue.LinkedList(LinkedList是双向链表,它实现了Dequeue接口). 使用非阻塞队列的时候有一个很大问题就是:它不会 ...

  4. java并发:阻塞队列

    第一节 阻塞队列 1.1 初识阻塞队列 队列以一种先进先出的方式管理数据,阻塞队列(BlockingQueue)是一个支持两个附加操作的队列,这两个附加的操作是:在队列为空时,获取元素的线程会等待队列 ...

  5. Java并发编程之队列

    Deque(双端队列) 子接口BlockingDeque,实现类如下: ArrayDeque:大下可变的数组双端队列,不允许插入null LinkedList:大小可变的链表双端队列,允许插入null ...

  6. Java并发编程:阻塞队列(转载)

    Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList), ...

  7. 【转】Java并发编程:阻塞队列

    在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList),这些工具都为我们编写多线程程 ...

  8. 12、Java并发编程:阻塞队列

    Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList), ...

  9. (转)Java并发编程:阻塞队列

    Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList), ...

随机推荐

  1. [bzoj 1468][poj 1741]Tree [点分治]

    Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...

  2. 关于Class.forName(className).newInstance()介绍

    Class.forName(xxx.xx.xx) 返回的是一个类 首先你要明白在java里面任何class都要装载在虚拟机上才能运行.这句话就是装载类用的(和new 不一样,要分清楚). 至于什么时候 ...

  3. javascript数组(1) ——sort的工作原理及其他数组排序方法

    一说到数组排序,最直观的想法就是用sort啊! 请问不用使用sort方法还可以使用什么方法进行数组排序? 比如 :  快速排序法.合并排序法.冒泡排序法.选择排序法.插入排序法.布尔排序法.交互排序. ...

  4. (转)linux常用查看硬件设备信息命令

    场景:在一篇博客中看到这些总结性命令,感觉很实用就转载,以后用到进行相关的整理 系统 # uname -a # 查看内核/操作系统/CPU信息 # lsb_release -a # 查看操作系统版本 ...

  5. Mybatis Dynamic Query 简单筛选

    在框架中,筛选描述类有两种(FilterDescriptor, FilterGroupDescriptor),这里我们主要举例来说明FilterDescriptor用法. FilterDescript ...

  6. Hbase单机安装部署

    Hbase单机安装部署 http://blogxinxiucan.sh1.newtouch.com/2017/07/27/Hbase单机安装部署/ 下载Hbase Hbase官网下载地址 http:/ ...

  7. dubbo&hsf&spring-cloud简单介绍

    Dubbo: 简介:Dubbo是一个分布式服务框架,以及SOA治理方案.其功能主要包括:高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等. 底部NIO基于netty ...

  8. decode

    含义解释: decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN ...

  9. 感知器算法--python实现

    写在前面: 参考: 1  <统计学习方法>第二章感知机[感知机的概念.误分类的判断]   http://pan.baidu.com/s/1hrTscza 2   点到面的距离 3   梯度 ...

  10. linux下更改ssh登录前的banner信息

    默认情况下,telnet ip 22端口会显示 openssh的版本信息 whereis sshd 如 cp /usr/sbin/sshd /usr/sbin/sshd2016.bak sed -i  ...