阻塞队列

阻塞队列是Java 5并发新特性中的内容,阻塞队列的接口是java.util.concurrent.BlockingQueue,它有多个实现类:ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等,用法大同小异,具体可查看JDK文档,这里简单举例看下ArrayBlockingQueue,它实现了一个有界队列,当队列满时,便会阻塞等待,直到有元素出队,后续的元素才可以被加入队列。

看下面的例子:

    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.ArrayBlockingQueue;   

    public class BlockingQueueTest{
            public static void main(String[] args) throws InterruptedException {
                    BlockingQueue<String> bqueue = new ArrayBlockingQueue<String>(20);
                    for (int i = 0; i < 30; i++) {
                            //将指定元素添加到此队列中
                            bqueue.put("加入元素" + i);
                            System.out.println("向阻塞队列中添加了元素:" + i);
                    }
                    System.out.println("程序到此运行结束,即将退出----");
            }
    }  

输出结果如下:

从执行结果中可以看出,由于队列中元素的数量限制在了20个,因此添加20个元素后,其他元素便在队列外阻塞等待,程序并没有终止。

如果队列已满后,我们将队首元素移出,并可以继续向阻塞队列中添加元素,修改代码如下:

    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.ArrayBlockingQueue;   

    public class BlockingQueueTest{
            public static void main(String[] args) throws InterruptedException {
                    BlockingQueue<String> bqueue = new ArrayBlockingQueue<String>(20);
                    for (int i = 0; i < 30; i++) {
                            //将指定元素添加到此队列中
                            bqueue.put("" + i);
                            System.out.println("向阻塞队列中添加了元素:" + i);
                            if(i > 18){
                                //从队列中获取队头元素,并将其移出队列
                                System.out.println("从阻塞队列中移除元素:" + bqueue.take());
                            }
                    }
                    System.out.println("程序到此运行结束,即将退出----");
            }
    }  

执行结果如下:

从结果中可以看出,当添加了第20个元素后,我们从队首移出一个元素,这样便可以继续向队列中添加元素,之后每添加一个元素,便从将队首元素移除,这样程序便可以执行结束。

阻塞栈

阻塞栈与阻塞队列相似,只是它是Java 6中加入的新特性,阻塞栈的接口java.util.concurrent.BlockingDeque也有很多实现类,使用方法也比较相似,具体查看JDK文档。

下面同样给出一个简单的例子:

    import java.util.concurrent.BlockingDeque;
    import java.util.concurrent.LinkedBlockingDeque;   

    public class BlockingDequeTest {
        public static void main(String[] args) throws InterruptedException {
                BlockingDeque<String> bDeque = new LinkedBlockingDeque<String>(20);
                for (int i = 0; i < 30; i++) {
                    //将指定元素添加到此阻塞栈中
                    bDeque.putFirst("" + i);
                    System.out.println("向阻塞栈中添加了元素:" + i);
                }
                System.out.println("程序到此运行结束,即将退出----");
        }
    }  

执行结果如下:

程序依然会阻塞等待,我们改为如下代码:

    import java.util.concurrent.BlockingDeque;
    import java.util.concurrent.LinkedBlockingDeque;   

    public class BlockingDequeTest {
        public static void main(String[] args) throws InterruptedException {
                BlockingDeque<String> bDeque = new LinkedBlockingDeque<String>(20);
                for (int i = 0; i < 30; i++) {
                    //将指定元素添加到此阻塞栈中
                    bDeque.putFirst("" + i);
                    System.out.println("向阻塞栈中添加了元素:" + i);
                    if(i > 18){
                        //从阻塞栈中取出栈顶元素,并将其移出
                        System.out.println("从阻塞栈中移出了元素:" + bDeque.pollFirst());
                    }
                }
                System.out.println("程序到此运行结束,即将退出----");
        }
    }  

执行结果如下:

    从结果中可以看出,当添加了第20个元素后,我们从将栈顶元素移处,这样便可以继续向栈中添加元素,之后每添加一个元素,便将栈顶元素移出,这样程序便可以执行结束。

java并发编程(十八)阻塞队列和阻塞栈的更多相关文章

  1. Java并发(十八):阻塞队列BlockingQueue

    阻塞队列(BlockingQueue)是一个支持两个附加操作的队列. 这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用. 阻塞队列常用于生产 ...

  2. 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport

    在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...

  3. Java并发编程(八)同步容器

    为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch) 一.为什么会出现同步容器? ...

  4. Java并发编程(八)线程间协作(上)

    多线程并发执行时,不同的线程执行的内容之间可能存在一些依赖关系,比如线程一执行a()方法和c()方法,线程二执行b()方法,方法a()必须在方法b()之前执行,而方法c()必须在方法b()之后执行.这 ...

  5. java并发编程(八)多线程环境下安全使用集合

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17200509     在集合API中,最初设计的Vector和Hashtable是多线程安 ...

  6. Java并发编程(八)-- 死锁

    简介 当两个以上的运算单元,双方都在等待对方停止运行,以获取系统资源,但是没有一方提前退出时,就称为死锁.在多任务操作系统中,操作系统为了协调不同进程,能否获取系统资源时,为了让系统运作,必须要解决这 ...

  7. Java并发编程(八):线程调度——线程池

    new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { / ...

  8. Java并发编程(八)不变性

    提到不变性我首先想到的就是String这个类了. 之前学习了很多原子性以及可见性的问题:失效数据,丢失更新操作或者某个对象的状态不一致,都与多线程试图访问同一个可变的相关. 如果对象的状态不会发生改变 ...

  9. 【Java并发编程】并发编程大合集-值得收藏

    http://blog.csdn.net/ns_code/article/details/17539599这个博主的关于java并发编程系列很不错,值得收藏. 为了方便各位网友学习以及方便自己复习之用 ...

  10. 【Java并发编程】并发编程大合集

    转载自:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容按照由浅 ...

随机推荐

  1. ES6 - Note6:Set与Map

    Set和Map是ES6中新增的数据结构,Set是集合,无序唯一,Map类似于对象,也是"key-value"形式,但是key不局限于字符串. 1.Set的用法 Set是构造函数,可 ...

  2. 【皇甫】☀Hibernate入门

    说说我们最近的一些事 二期已经过去了,下面迎接的就是二年,据原老师讲解,我们10月份就开始陆续找工作了,虽然他说我们找工作不是问题,可每个人都有自知之明,我也知道我所处的位置,所以我清楚我要怎么做,我 ...

  3. 获取OpenCV中RotatedRect的绝对角度

    opencv中RotatedRect的angle这个成员变量总是诡异的不同寻常(http://stackoverflow.com/questions/15956124/minarearect-angl ...

  4. ASP.NET MVC 教程

    http://msdn.microsoft.com/zh-cn/dd327597.aspx

  5. Android音频底层调试-基于tinyalsa

    因为Android中默认并没有使用标准alsa,而是使用的是tinyalsa.所以就算基于命令行的測试也要使用libtinyalsa.Android系统在上层Audio千变万化的时候,能够能这些个工具 ...

  6. javaScript笔记1

    一.通过 id 访问HTML元素,可以使用 document.getElementById(id) 方法. 例子: <body> <button id="mybtn&quo ...

  7. js 配置基础启动文件

    页面启动文件boot.js,获取存放该文件的路径,放置通用的css,js代码,方便html页面调用. __CreateJSPath = function (js) { var scripts = do ...

  8. 前端面试题整理(css)

    1.介绍所知道的CSS hack技巧(如:_, *, +, \9, !important 之类). CSS hack的原理: 由于不同的浏览器和浏览器各版本对CSS的支持及解析结果不一样,以及CSS优 ...

  9. 开涛spring3(4.2) - 资源 之 4.2 内置Resource实现

    4.2  内置Resource实现 4.2.1  ByteArrayResource ByteArrayResource代表byte[]数组资源,对于“getInputStream”操作将返回一个By ...

  10. DOM事件类型总结大全

    unload:事件在用户退出页面时发生 window.onload = function(){ return "页面关闭!"; }; onblur:失去焦点发生变化 window. ...