转载请注明出处:http://blog.csdn.net/ns_code/article/details/17511147



阻塞队列

阻塞队列是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并发编程】:并发新特性—塞队列和阻塞栈

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

  2. java并发编程(二十一)----(JUC集合)CopyOnWriteArraySet和ConcurrentSkipListSet介绍

    这一节我们来接着介绍JUC集合:CopyOnWriteArraySet和ConcurrentSkipListSet.从名字上来看我们知道CopyOnWriteArraySet与上一节讲到的CopyOn ...

  3. 转: 【Java并发编程】之五:volatile变量修饰符—意料之外的问题(含代码)

    转载请注明出处:     volatile用处说明     在JDK1.2之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的.而随着JVM的成熟和优化,现在在多线程 ...

  4. 并发编程(二)------并发类容器ConcurrentMap

    并发类容器: jdk5.0以后提供了多种并发类容器来替代同步类容器从而改善性能. 同步类容器的状态都是串行化的. 他们虽然实现了线程安全,但是严重降低了并发性,在多线程环境时,严重降低了应用程序的吞吐 ...

  5. 转:【Java并发编程】之八:多线程环境中安全使用集合API(含代码)

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

  6. 【Java并发编程】之六:Runnable和Thread实现多线程的区别(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17161237 Java中实现多线程有两种方法:继承Thread类.实现Runnable接口 ...

  7. java并发编程笔记(十一)——高并发处理思路和手段

    java并发编程笔记(十一)--高并发处理思路和手段 扩容 垂直扩容(纵向扩展):提高系统部件能力 水平扩容(横向扩容):增加更多系统成员来实现 缓存 缓存特征 命中率:命中数/(命中数+没有命中数) ...

  8. [Java并发编程(二)] 线程池 FixedThreadPool、CachedThreadPool、ForkJoinPool?为后台任务选择合适的 Java executors

    [Java并发编程(二)] 线程池 FixedThreadPool.CachedThreadPool.ForkJoinPool?为后台任务选择合适的 Java executors ... 摘要 Jav ...

  9. 【Java并发编程实战】----- AQS(四):CLH同步队列

    在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...

随机推荐

  1. Python 发展历史

    1. Python发展历史 起源 Python的作者,Guido von Rossum,荷兰人.1982年,Guido从阿姆斯特丹大学获得了数学和计算机硕士学位.然而,尽管他算得上是一位数学家,但他更 ...

  2. HTML 基本标签02

    02-html基本标签 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...

  3. [STM32F429-DISCO-HAL]4.Uart 的使用

    今天来学习一下最常用的外设之一USART. 首先是硬件的连接,我们需要至少三根线,GND,TX,RX.参阅datasheet.默认的USART1_TX和USART1_RX的引脚如下图 关于HAL dr ...

  4. Hotkeys.js 2.0.2 发布,捕获键盘输入和输入的组合键快捷键,它没有依赖

    这是一个强健的 Javascript 库用于捕获键盘输入和输入的组合键,它没有依赖,压缩只有只有(~3kb),gzip:1.9k. 更新内容: 添加测试用例: 添加更多特殊键支持: 修复bug. __ ...

  5. python学习===打印时间

    >>> import time >>> print(time.time()) 1501749158.9849465 >>> print(time. ...

  6. POSTMAN-REST Client

    下载方式:翻.墙安装     #使用的时候不用翻.墙 下载地址:https://chrome.google.com/webstore/search/postman%20rest%20client Po ...

  7. SpringMVC 初级操作

    SpringMVC介绍 SpringMVC也叫Spring Web MVC,属于表现层框架. SpringMVC属于Spring框架的一部分,是在Spring3.0后发布的. Spring结构图: S ...

  8. [js高手之路] 设计模式系列课程 - jQuery的链式调用与灵活的构造函数

    一.我们从一个简单的构造函数+原型程序开始 var G = function(){}; G.prototype = { length : 5, size : function(){ return th ...

  9. 【Centos7】hostnamectl 设置主机名

    Centos7中提供了设置主机名的工具 hostnamectl hostname有三种状态 static(永久) transient(瞬态) pretty (灵活) 查看主机名状态 [oracle@h ...

  10. Java 环境设置

    Java 环境设置 本地环境设置 如果你依然想要为 Java 编程语言设置环境,那么本节将指导你如何在你的电脑上下载和设置 Java.请按照以下步骤进行环境设置. Java SE 可以从下载 Java ...