阻塞队列

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

看下面的例子:

  1. import java.util.concurrent.BlockingQueue;
  2. import java.util.concurrent.ArrayBlockingQueue;
  3. public class BlockingQueueTest{
  4. public static void main(String[] args) throws InterruptedException {
  5. BlockingQueue<String> bqueue = new ArrayBlockingQueue<String>(20);
  6. for (int i = 0; i < 30; i++) {
  7. //将指定元素添加到此队列中
  8. bqueue.put("加入元素" + i);
  9. System.out.println("向阻塞队列中添加了元素:" + i);
  10. }
  11. System.out.println("程序到此运行结束,即将退出----");
  12. }
  13. }

输出结果如下:

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

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

  1. import java.util.concurrent.BlockingQueue;
  2. import java.util.concurrent.ArrayBlockingQueue;
  3. public class BlockingQueueTest{
  4. public static void main(String[] args) throws InterruptedException {
  5. BlockingQueue<String> bqueue = new ArrayBlockingQueue<String>(20);
  6. for (int i = 0; i < 30; i++) {
  7. //将指定元素添加到此队列中
  8. bqueue.put("" + i);
  9. System.out.println("向阻塞队列中添加了元素:" + i);
  10. if(i > 18){
  11. //从队列中获取队头元素,并将其移出队列
  12. System.out.println("从阻塞队列中移除元素:" + bqueue.take());
  13. }
  14. }
  15. System.out.println("程序到此运行结束,即将退出----");
  16. }
  17. }

执行结果如下:

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

阻塞栈

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

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

  1. import java.util.concurrent.BlockingDeque;
  2. import java.util.concurrent.LinkedBlockingDeque;
  3. public class BlockingDequeTest {
  4. public static void main(String[] args) throws InterruptedException {
  5. BlockingDeque<String> bDeque = new LinkedBlockingDeque<String>(20);
  6. for (int i = 0; i < 30; i++) {
  7. //将指定元素添加到此阻塞栈中
  8. bDeque.putFirst("" + i);
  9. System.out.println("向阻塞栈中添加了元素:" + i);
  10. }
  11. System.out.println("程序到此运行结束,即将退出----");
  12. }
  13. }

执行结果如下:

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

  1. import java.util.concurrent.BlockingDeque;
  2. import java.util.concurrent.LinkedBlockingDeque;
  3. public class BlockingDequeTest {
  4. public static void main(String[] args) throws InterruptedException {
  5. BlockingDeque<String> bDeque = new LinkedBlockingDeque<String>(20);
  6. for (int i = 0; i < 30; i++) {
  7. //将指定元素添加到此阻塞栈中
  8. bDeque.putFirst("" + i);
  9. System.out.println("向阻塞栈中添加了元素:" + i);
  10. if(i > 18){
  11. //从阻塞栈中取出栈顶元素,并将其移出
  12. System.out.println("从阻塞栈中移出了元素:" + bDeque.pollFirst());
  13. }
  14. }
  15. System.out.println("程序到此运行结束,即将退出----");
  16. }
  17. }

执行结果如下:

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

【Java并发编程】:并发新特性—塞队列和阻塞栈的更多相关文章

  1. Java 多线程:并发编程的三大特性

    Java 多线程:并发编程的三大特性 作者:Grey 原文地址: 博客园:Java 多线程:并发编程的三大特性 CSDN:Java 多线程:并发编程的三大特性 可见性 所谓线程数据的可见性,指的就是内 ...

  2. JAVA JDK1.5-1.9新特性

    1.51.自动装箱与拆箱:2.枚举(常用来设计单例模式)3.静态导入4.可变参数5.内省 1.61.Web服务元数据2.脚本语言支持3.JTable的排序和过滤4.更简单,更强大的JAX-WS5.轻量 ...

  3. Java 8 正式发布,新特性全搜罗

    经过2年半的努力.屡次的延期和9个里程碑版本,甲骨文的Java开发团队终于发布了Java 8正式版本. Java 8版本最大的改进就是Lambda表达式,其目的是使Java更易于为多核处理器编写代码: ...

  4. Java引入的一些新特性

    Java引入的一些新特性 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程, ...

  5. Python并发编程-并发解决方案概述

    Python并发编程-并发解决方案概述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.并发和并行区别 1>.并行(parallel) 同时做某些事,可以互不干扰的同一个时 ...

  6. Java学习之==>Java8 新特性详解

    一.简介 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.Java 8是 Java 自 Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库. ...

  7. 使用示例带你提前了解 Java 9 中的新特性

    使用示例带你提前了解 Java 9 中的新特性 转载来源:https://juejin.im/post/58c5e402128fe100603cc194 英文出处:https://www.journa ...

  8. 转: 【Java并发编程】之二十一:并发新特性—阻塞队列和阻塞栈(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17511147 阻塞队列 阻塞队列是Java5并发新特性中的内容,阻塞队列的接口是Java. ...

  9. java并发编程(十八)阻塞队列和阻塞栈

    阻塞队列 阻塞队列是Java 5并发新特性中的内容,阻塞队列的接口是java.util.concurrent.BlockingQueue,它有多个实现类:ArrayBlockingQueue.Dela ...

随机推荐

  1. centos6 mysql 安装与配置

    MySQL简介: 由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库.MySQL是一个多用户.多线程的关系型数据库管理 ...

  2. 如何使用 Visual C# 2005 或 Visual C# .NET 向 Excel 工作簿传输数据

    本文分步介绍了多种从 Microsoft Visual C# 2005 或 Microsoft Visual C# .NET 程序向 Microsoft Excel 2002 传输数据的方法.本文还提 ...

  3. 三)mybatis 二级缓存,整合ehcache

    mybatis-config.xml <setting name="cacheEnabled" value="true" /> PersonMapp ...

  4. Get异步请求

    1: 使用代理 //1.delegate         //创建url      NSURL *url = [[NSURL alloc] initWithString:@"http:ima ...

  5. HDU6024 Building Shops 2017-05-07 18:33 30人阅读 评论(0) 收藏

    Building Shops                                                             Time Limit: 2000/1000 MS ...

  6. OpenGL模型视图变换、投影变换、视口变换的理解

    OpenGL中不设置模型,投影,视口,所绘制的几何图形的坐标只能是-1到1(X轴向右,Y轴向上,Z轴垂直屏幕向外). 产生目标场景的过程类似于用照相机进行拍照: (1)把照相机固定在三角架上,并让他对 ...

  7. Create Your Content and Structure

    The original page source Content is the most important aspect of any site. So let's design for the c ...

  8. 短URL

    短网址应用已经在全国各大微博上开始流行了起来.例如QQ微博的url.cn,新郎的sinaurl.cn等. 我们在QQ微博上发布网址的时候,微博会自动判别网址,并将其转换,例如:http://url.c ...

  9. Microsoft SQL Server 2012 管理 (1): 安装配置SQL Server 重点

    SQL Server 可以在实例,数据库,列,查询分别指定排序规则 /* Module 1 - working with Clollations */ -- 1.1 Obtain the Instan ...

  10. [ACM_模拟] UVA 12504 Updating a Dictionary [字符串处理 字典增加、减少、改变问题]

      Updating a Dictionary  In this problem, a dictionary is collection of key-value pairs, where keys ...