阻塞队列

阻塞队列是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. S4 exercise -- 模块

    写一个用户登录验证程序,文件如下1234.json {"expire_date": "2021-01-01", "id": 1234, &q ...

  2. python编码(一)

    下面介绍一下python的编码机制,unicode, utf-8, utf-16, GBK, GB2312,ISO-8859-1等编码之间的转换. 1.自动识别字符串编码: #coding:utf8 ...

  3. Java Toolkit类用法

    这是一个AWT工具箱.它提供对本地GUI最低层次的JAVA访问.在大多情况下,这个类不直接用在小应用程序或应用程序中.具有把行图形数据转换为可显示的图像.返回字体信息.得出显示尺寸和分辨率以及获得系统 ...

  4. Java 容器 LinkedHashMap源码分析1

    同 HashMap 一样,LinkedHashMap 也是对 Map 接口的一种基于链表和哈希表的实现.实际上, LinkedHashMap 是 HashMap 的子类,其扩展了 HashMap 增加 ...

  5. jquery ui导入两次的错误提示

    如果jquery ui plugin的js文件出现到两次的话,就会出现报错. 解决办法: 找出引用了jquery ui 的文件,将其中一个去掉就ok了. 在Firefox下面的报错提示: TypeEr ...

  6. Win10系统下编译OSG3.4

    环境说明 1.Win10专业版.64位: 2.VS2012旗舰版:QT5.2.0: 3.cmake-3.9.0.64位: 资源准备 1.OSG3.4源码包 http://trac.opensceneg ...

  7. DBCC--CHECKIDENT

    检查活或重置自增键的标识值,可以使用NORESEED 来检查当前标识值和标识列在表中的最大值. 如果当前标识值与表中数据冲突或希望将标识值重置到一个较小的值时,可以只用RESEED 来设置 DBCC ...

  8. Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization【转】

    https://developer.valvesoftware.com/wiki/Latency_Compensating_Methods_in_Client/Server_In-game_Proto ...

  9. .netcore部署centos

    前言:最近公司有个项目用 .netcore开发的项目,然后闲的没事就研究如果发布到Linux系统上 需要安装的插件以及支撑架构 1.dotnetSDK 2.jexus Jexus 是Linux平台上 ...

  10. 如何读取maven项目中的resources

    建立一个maven web项目,project-name/src/main下面有3个目录,java.resources.webapp java中存放java源代码,package等 resources ...