文档章节

blockingqueue学习笔记

tongqu
 tongqu
发布于 2016/02/17 00:45
字数 632
阅读 53
收藏 2

码上生花,ECharts 作品展示赛正式启动!>>>

一。接口blockingqueue

      1>BlockingQueue是一种特殊的queue,特殊性如下:
      若blockingQueue是空的,从该队列中取东西的操作将会被阻断进入等待状态,知道blockingqueue进了新货才会被唤醒。
      若blockingQueue是满的,向该队列中村东西的操作也会被阻断进入等待状态,直到blockingqueue有了空间才会被唤醒
     2>BlockingQueue主要有以下方法

     添加类方法:
    add(Object)方法:如果没满返回true,如果满了抛出illegalStateException
     offer(Object)方法:如果没满返回true,如果满了返回false
     put(Object)方法:如果没满返回true,如果满了阻塞直到有新空间
    拿取类方法:
    poll(time)方法:如果为空阻塞,如果一直为空time时间后返回null
    take()方法:如果为空一直阻塞到不为空

二。BlockingDeque

      deque一般是双端队列,会比queue多addFirst、addLast、等方法,具体方法参考queue。

三。BlockingQueue和BLockingDeque的几种实现

    1>ArrayBlockingQueue

          是线程安全的,构造器必须带长度,可以规定访问策略是否为FIFO(先入先出) 默认就是FIFO的,fair参数如果是false的话,先入不能保证,所以先出也没用了,原因是在竞争锁时,不能保证顺序。

    2>LinkedBlockingQueue

           线程安全的,构造器可以不定义大小,也可以定义。若不带大小,最大为Integer.MAX_VALUE决定

    1>、2>相比,2的数据吞吐量要大,但在线程数量很大是,其性能的可预见性要低于1

    3>PriorityBlockingQueue。

            它最大的特点是

            可以自己定义一个比较器,个性化为队列的顺序排序。用法很简单。

    4>SynchronousQueue

            这个queue比较特殊,对其操作必须是放和取交替完成的。用到再研究

 

四。用BlockingQueue来实现Producer和Consumer的例子,代码如下:

 

public class BlockingQueueTest {
    public static class Basket {
        BlockingQueue<String> basket = new ArrayBlockingQueue<String>(3);
        public void produce() throws InterruptedException {
            basket.put("An apple");
        }
        public int getSize(){
            return basket.size();
        }
        public String consume() throws InterruptedException {
            return basket.take();
        }
    }

    public static void testBasket() {
        final Basket basket = new Basket();
        class Consumer implements Runnable {

            @Override
            public void run() {
                try {
                    while (true) {
                        System.out.println("消费苹果"+(basket.getSize()+1)+"中");
                        basket.consume();
                        System.out.println("消费"+basket.getSize()+"苹果");
                        Thread.sleep(1000);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        class Producer implements Runnable {


            @Override
            public void run() {
                try {
                    while (true) {
                        System.out.println("生产"+(basket.getSize()+1)+"苹果中");
                        basket.produce();
                        System.out.println("生产"+basket.getSize()+"苹果");
                        Thread.sleep(300);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        ExecutorService service=Executors.newCachedThreadPool();
        Producer producer=new Producer();
        Consumer consumer=new Consumer();
        service.submit(producer);
        service.submit(consumer);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        service.shutdownNow();
    }
    public static void main(String[] args) {
        testBasket();
    }
}

 

 

 

 

 

 

 

 

 

 

 

© 著作权归作者所有

tongqu
粉丝 38
博文 37
码字总数 26162
作品 0
海淀
私信 提问
加载中
请先登录后再评论。
官网英文版学习——RabbitMQ学习笔记(八)Remote procedure call (RPC)

在第四篇学习笔记中,我们学习了如何使用工作队列在多个工作者之间分配耗时的任务。 但是,如果我们需要在远程计算机上运行一个函数并等待结果呢?这是另一回事。这种模式通常称为远程过程调用...

osc_wwi372bn
2018/06/18
2
0
java 队列阻塞方法ArrayBlockingQueue学习

本例介绍一个特殊的队列:BlockingQueue,如果BlockQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.同样,如果BlockingQueue是满的,任何...

孟飞阳
2016/07/01
141
0
第十二篇:ArrayBlockingQueue的源码解析(基于JDK1.8)

前言 上一篇我们手写了一个阻塞队列,今天我们接着开始学习之旅,让我们一起来看看ArrayBlockingQueue的源码吧。ArrayBlockingQueue是JDK中提供的工业级的通过数组实现的阻塞队列。 初始Arr...

码农飞哥
02/08
0
0
java中并发Queue种类与各自API特点以及使用场景!

一 先说下队列 队列是一种数据结构.它有两个基本操作:在队列尾部加入一个元素,和从队列头部移除一个元素(注意不要弄混队列的头部和尾部) 就是说,队列以一种先进先出的方式管理数据,如...

osc_s7vlimu6
2018/06/02
1
0
BlockingQueue学习

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

jiangmitiao
2015/08/30
136
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在macOS或OS X上安装pip? - How do I install pip on macOS or OS X?

问题: This post is a Community Wiki . 这篇文章是社区维基 。 Edit existing answers to improve this post. 编辑现有答案以改善此职位。 It is not currently accepting new answers. 它......

fyin1314
40分钟前
11
0
net.sf.JSONException Map中value字段为null,服务响应500

6月2号凌晨系统生产发布,2号白天仓库作业时有仓库拣选单打印面单接口500,不是所有的拣选单掉接口都是500, 当时通过接口响应正产和响应500,逻辑梳理以及数据对比,最后发现是Map 对象里面...

Lbj虞
47分钟前
9
0
SpringMVC异步请求

AsyncController @Controllerpublic class AsyncController { /** * 1. 控制器返回Callable * 2. Spring异步处理,将Callable提交到TaskExecutor,使用隔离的线城进行执行...

与你同行7Melody
今天
5
0
在动态创建的元素上进行事件绑定? - Event binding on dynamically created elements?

问题: I have a bit of code where I am looping through all the select boxes on a page and binding a .hover event to them to do a bit of twiddling with their width on mouse on/of......

javail
今天
19
0
js 使用canvas 旋转 图片

最左边是原始图片,中间是canvas内容,右边是将canvas内容导出到img标签中 canvas绘图时,确定图片的原始尺寸,不是显示的dom大小,需要创建元素后获得 如果使用dom大小的话,会在绘制时只能...

阿豪boy
今天
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部