转: 【Java并发编程】之二十一:并发新特性—阻塞队列和阻塞栈(含代码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17511147
阻塞队列
阻塞队列是Java5并发新特性中的内容,阻塞队列的接口是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并发编程】之二十一:并发新特性—阻塞队列和阻塞栈(含代码)的更多相关文章
- 【Java并发编程】:并发新特性—塞队列和阻塞栈
阻塞队列 阻塞队列是Java5并发新特性中的内容,阻塞队列的接口是Java.util.concurrent.BlockingQueue,它有多个实现类:ArrayBlockingQueue.Delay ...
- java并发编程(二十一)----(JUC集合)CopyOnWriteArraySet和ConcurrentSkipListSet介绍
这一节我们来接着介绍JUC集合:CopyOnWriteArraySet和ConcurrentSkipListSet.从名字上来看我们知道CopyOnWriteArraySet与上一节讲到的CopyOn ...
- 转: 【Java并发编程】之五:volatile变量修饰符—意料之外的问题(含代码)
转载请注明出处: volatile用处说明 在JDK1.2之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的.而随着JVM的成熟和优化,现在在多线程 ...
- 并发编程(二)------并发类容器ConcurrentMap
并发类容器: jdk5.0以后提供了多种并发类容器来替代同步类容器从而改善性能. 同步类容器的状态都是串行化的. 他们虽然实现了线程安全,但是严重降低了并发性,在多线程环境时,严重降低了应用程序的吞吐 ...
- 转:【Java并发编程】之八:多线程环境中安全使用集合API(含代码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17200509 在集合API中,最初设计的Vector和Hashtable是多线程安 ...
- 【Java并发编程】之六:Runnable和Thread实现多线程的区别(含代码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17161237 Java中实现多线程有两种方法:继承Thread类.实现Runnable接口 ...
- java并发编程笔记(十一)——高并发处理思路和手段
java并发编程笔记(十一)--高并发处理思路和手段 扩容 垂直扩容(纵向扩展):提高系统部件能力 水平扩容(横向扩容):增加更多系统成员来实现 缓存 缓存特征 命中率:命中数/(命中数+没有命中数) ...
- [Java并发编程(二)] 线程池 FixedThreadPool、CachedThreadPool、ForkJoinPool?为后台任务选择合适的 Java executors
[Java并发编程(二)] 线程池 FixedThreadPool.CachedThreadPool.ForkJoinPool?为后台任务选择合适的 Java executors ... 摘要 Jav ...
- 【Java并发编程实战】----- AQS(四):CLH同步队列
在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...
随机推荐
- window.settimeout用法与window.setInterval用法的区别
setTimeout 和setInterval的功能都是经过某一个时间段后发生某件指定的事件或者方法. window.setTimeout方法是定时程序,也就是在某时间以后干什么, window.se ...
- 用netstat查看网络状态详解
--用netstat查看网络状态详解 -----------------------------2014/06/11 一.Linux服务器上11种网络连接状态: ...
- 搭建 keras + tensorflow
每次搭建深度学习环境的总要搜索各类参考. 这次搭环境,自己做个记录.这样以后搭建环境就拿自己 的文章做主线索引. (如果参照我的博客安装的,欢迎转载分享 ) 1. 安装操作系统 (ubuntu-1 ...
- 在AWS中部署OpenShift平台
OpenShift是RedHat出品的PAAS平台.OpenShift做为PAAS平台最大的特点是它是完全容器化的PAAS平台,底层封装了Docker和Kubernetes,上层暴露了对开发者友好的接 ...
- 【转载】B树、B-树、B+树、B*树
转载自http://blog.csdn.net/manesking/archive/2007/02/09/1505979.aspx B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和 ...
- BYS推荐MS前端PhoneCall面试问题整理-2
JS:1. 如何为一个已有的对象加一个新的方法,Prototype,这个不仅要知道,还要用过,写过 2. Angular和Ember比较的优势或不同点在哪里 3. null和undefined的区别, ...
- How to execute tons of tasks parallelly with TPL method?
List<Task> taskList = new List<Task>(); // string currentNoStr = null; cannot define at ...
- 深入解析JavaScript中的this关键字
如果问初学者js中什么东西比较难懂,很多回答会是this关键字.this在不同场景下所指向的对象不同,这就有一种扑朔迷离的感觉,放佛魔法一般神秘:this到底是什么?这里有四种绑定规则. 1. 默认绑 ...
- .NET Core 2.0迁移技巧之MemoryCache问题修复
对于传统的.NET Framework项目而言,System.Runtime.Caching命名空间是常用的工具了,其中MemoryCache类则常被用于实现内存缓存. .NET Core 2.0暂时 ...
- textarea 空格的问题
如果textarea开始标签和结束标签中间有空格,则textarea默认有空格. <textarea name=" > </textarea> 效果图 所以,如果想去 ...