1.BlockingQueue 顾名思义就是阻塞队列

最经典的使用场合就是 生产者 - 消费者 模型啦,其优点是队列控制已经处理好,用户只需要存(满了会阻塞),取(空了会阻塞)

可以更多的关心核心逻辑,而不是并发控制

PS: BlockingDeque是阻塞双向队列,这里不作讲解,其实意思差不多啦

add(E e)       添加元素,如果失败则抛出exception

put(E e)        添加元素,如果队列满,则阻塞

offer(E e)      添加元素,如果队列满则返回false

offer(E e, long timeout, TimeUnit unit) 同上,但是有timeout

take(E e)      取出元素,如果队列空,则阻塞

poll( long timeout, TimeUnit unit) 在一定时间内取出元素,如无则返回null

drainTo()     一次性取出所有元素

2.各种阻塞队列

1) ArrayBlockingQueue

以数组为基础的queue, 建立时需要定义大小,同时可以定义公平锁 or not.

有一个特点是 元素在取出或者插入时使用同一个锁,或许是对性能影响不大?

2) LinkedBlockingQueue

以链表为基础的queue,建立时是不定义大小的,所以要注意生产太多内存会耗尽

与数组队列不同的是该队列在取出与写入是有分开的锁,理论上性能更好

但是具体还是得分情况,最好都试试,据说VM对array的优化很好,可能有惊喜

3) PriorityBlockingQueue

带有优先级的队列,同样不限定大小,只有在队列空的时候进行阻塞

定义的时候需要给与一个comparator

4)DelayQueue

延迟队列,具体使用情况,例如长时间无响应等

其实就是一个特别版的优先队列,优先度就是延迟,在获取元素的时候会根据延迟的大小决定是否返回元素

5)SynchronousQueue

同步队列,我的理解就是一个put对应一个take, 只有空的时候可以放东西,只能放一个

暂时没想到什么使用场合

3. 内部实现

具体细节我就不讲了,大家可以自己看,最主要就是在存取的时候用了之前说的lock来进行并发控制

而timeout则是由lock里condition的await实现,总体都不难,很容易看懂的

EXAMPLE

static ArrayBlockingQueue<Integer> arrayQueue;
static long startTime = System.currentTimeMillis(); public static void main(String[] args) {
arrayQueue = new ArrayBlockingQueue<Integer>(10); ExecutorService executor = Executors.newFixedThreadPool(4); //丢东西进去
Runnable producer = new Runnable() {
@Override
public void run() { for (int i = 0; i < 5; i++) {
try { int randomInt = i;
arrayQueue.put(randomInt); } catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
//拿东西出来
Runnable consumer = new Runnable() {
@Override
public void run() {
while (true)
{
try { System.out.println("remain capacity = "+arrayQueue.remainingCapacity());
Integer result = arrayQueue.poll(1,TimeUnit.SECONDS);
Thread.sleep(50);
if (result==null){
return;
} } catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}; //因为我的线程池是4,所以放4个任务进去
executor.submit(consumer);
executor.submit(producer);
executor.submit(producer);
executor.submit(producer); executor.shutdown(); }

  OUTPUT:

remain capacity = 10
remain capacity = 0
remain capacity = 0
remain capacity = 0
remain capacity = 0
remain capacity = 0
remain capacity = 1
remain capacity = 2
remain capacity = 3
remain capacity = 4
remain capacity = 5
remain capacity = 6
remain capacity = 7
remain capacity = 8
remain capacity = 9
remain capacity = 10

JAVA 1.5 并发之 BlockingQueue的更多相关文章

  1. Java并发之BlockingQueue的使用

    Java并发之BlockingQueue的使用 一.简介 前段时间看到有些朋友在网上发了一道面试题,题目的大意就是:有两个线程A,B,  A线程每200ms就生成一个[0,100]之间的随机数, B线 ...

  2. java并发包——阻塞队列BlockingQueue及源码分析

    一.摘要 BlockingQueue通常用于一个线程在生产对象,而另外一个线程在消费这些对象的场景,例如在线程池中,当运行的线程数目大于核心的线程数目时候,经常就会把新来的线程对象放到Blocking ...

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

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

  4. Java并发之BlockingQueue 阻塞队列(ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue、PriorityBlockingQueue、SynchronousQueue)

    package com.thread.test.thread; import java.util.Random; import java.util.concurrent.*; /** * Create ...

  5. Java并发之BlockingQueue

      一.Queue Queue是队列接口是 Collection的子接口.除了基本的 Collection操作外,队列还提供其他的插入.提取和检查操作.每个方法都存在两种形式:一种抛出异常(操作失败时 ...

  6. JAVA多线程之间共享数据BlockingQueue介绍

    在JAVA的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利. ...

  7. java.util.concurrent 包笔记 --- BlockingQueue

    BlockingQueue 队列接口,具有 4 组不同的方法用于插入.移除以及对队列中的元素进行检查.如果请求的操作不能得到立即执行的话,每个方法的表现也不同.这些方法如下:   Throws exc ...

  8. java并发包分析之———BlockingQueue

    一.概述: BlockingQueue作为线程容器,可以为线程同步提供有力的保障.   二.BlockingQueue定义的常用方法 1.BlockingQueue定义的常用方法如下:   抛出异常 ...

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

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

随机推荐

  1. isinstance/issubclass/type的区别?

    type() 判断某个对象是否是该类创建的,只看一层,如果是继承类,也不会考虑继承类的类型.. Issubclass() 判断该类是否是另一个类的派生类,也就是子类,参数为类. isinstance( ...

  2. linux c编程:popen

    我们在执行shell命令比如cat /etc/group | grep root的时候,通过管道的机制将cat /etc/group的结果传递给grep root,然后将结果显示出来 linux中提供 ...

  3. go语言之接口一

    在Go语言中,一个类只需要实现了接口要求的所有函数,我们就说这个类实现了该接口 我们定义了一个File类,并实现有Read().Write().Seek().Close()等方法.设 想我们有如下接口 ...

  4. iOS应用公布Invalid Binary问题解决方式

    上次公布一淘HD应用.头一天公布,第二天就上线,私下还在想.是不是苹果採用什么优化的解决方式了,导致审核速度加快了. 这两天公布新版.一直碰到Invaild Binary问题.才想明确,原来大家都被这 ...

  5. mysql中子查询更新,得用别名表

    通过查出最大id,来更新记录 update order set status = 'xx' where id in (select v.id from (select max(id) id from ...

  6. angular中按需加载js

    按需加载估计是大家在使用angular之后最想解决的问题吧,因为angular的依赖机制,导致了必须在第一次加载的时候就加载所有js文件,小项目还好,稍大一点的项目如果有上百个js文件,不管是从效率还 ...

  7. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点

    题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...

  8. 【Flask】Column常用参数

    ### Column常用参数:1. primary_key:设置某个字段为主键.2. autoincrement:设置这个字段为自动增长的.3. default:设置某个字段的默认值.在发表时间这些字 ...

  9. 【Flask模板】include标签

    # include标签:1. 这个标签相当于是直接将指定的模版中的代码复制粘贴到当前位置.2. `include`标签,如果想要使用父模版中的变量,直接用就可以了,不需要使用`with context ...

  10. MySQL创建用户并授权及撤销用户权限

    这篇文章主要介绍了MySQL创建用户并授权及撤销用户权限.设置与更改用户密码.删除用户等等,需要的朋友可以参考下 MySQL中创建用户与授权的实现方法. 运行环境:widnows xp profess ...