【Java并发编程】:并发新特性—塞队列和阻塞栈
阻塞队列
阻塞队列是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 多线程:并发编程的三大特性
Java 多线程:并发编程的三大特性 作者:Grey 原文地址: 博客园:Java 多线程:并发编程的三大特性 CSDN:Java 多线程:并发编程的三大特性 可见性 所谓线程数据的可见性,指的就是内 ...
- JAVA JDK1.5-1.9新特性
1.51.自动装箱与拆箱:2.枚举(常用来设计单例模式)3.静态导入4.可变参数5.内省 1.61.Web服务元数据2.脚本语言支持3.JTable的排序和过滤4.更简单,更强大的JAX-WS5.轻量 ...
- Java 8 正式发布,新特性全搜罗
经过2年半的努力.屡次的延期和9个里程碑版本,甲骨文的Java开发团队终于发布了Java 8正式版本. Java 8版本最大的改进就是Lambda表达式,其目的是使Java更易于为多核处理器编写代码: ...
- Java引入的一些新特性
Java引入的一些新特性 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程, ...
- Python并发编程-并发解决方案概述
Python并发编程-并发解决方案概述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.并发和并行区别 1>.并行(parallel) 同时做某些事,可以互不干扰的同一个时 ...
- Java学习之==>Java8 新特性详解
一.简介 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.Java 8是 Java 自 Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库. ...
- 使用示例带你提前了解 Java 9 中的新特性
使用示例带你提前了解 Java 9 中的新特性 转载来源:https://juejin.im/post/58c5e402128fe100603cc194 英文出处:https://www.journa ...
- 转: 【Java并发编程】之二十一:并发新特性—阻塞队列和阻塞栈(含代码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17511147 阻塞队列 阻塞队列是Java5并发新特性中的内容,阻塞队列的接口是Java. ...
- java并发编程(十八)阻塞队列和阻塞栈
阻塞队列 阻塞队列是Java 5并发新特性中的内容,阻塞队列的接口是java.util.concurrent.BlockingQueue,它有多个实现类:ArrayBlockingQueue.Dela ...
随机推荐
- Servlet从浅入深
Servlet是什么 servlet 是运行在 Web 服务器中的小型 Java 程序(即:服务器端的小应用程序). servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端 ...
- (匹配 二维建图) Antenna Placement --POJ --3020
链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82834#probl ...
- HDU2976 Dropping tests 2017-05-11 18:10 39人阅读 评论(0) 收藏
Dropping tests Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12187 Accepted: 4257 D ...
- Difference between the Bill of distribution and sourcing rule.
https://forums.oracle.com/thread/936768 This is from a users guide Oracle Supply Chain Planning ...
- 发展科技到底有什么用,转NASA专家给一位修女的一封信
问题补充:我们难道不应该把这些资金用于更深入的医疗保障和减少贫穷吗? 我们为何要仰望星空,花大量的金钱和精力探索那不可预知的宇宙呢?NASA科学家写给非洲修女的一封信回答得特别好,也特别震撼人心.—— ...
- 深入理解Aspnet Core之Identity(1)
最近学习asp.netcore 打算写出来和大家分享,我计划先写Identity部分,会从开始asp.netocre identity的简单实用开始,然后再去讲解主要的类和自定义这些类. 主题:asp ...
- pageadmin CMS网站建设教程: 附属表数据列表调用语法
列表调用语法 Html.SubDataList(参数1,参数2,参数3,参数4)参数说明: 注:第一个参数对象中必须定义Table或ParentTable/ParentField属性.参数1常用属性: ...
- RxJS入门之函数响应式编程
一.函数式编程 1.声明式(Declarativ) 和声明式相对应的编程⽅式叫做命令式编程(ImperativeProgramming),命令式编程也是最常见的⼀种编程⽅式. //命令式编程: fun ...
- 如使用Typescript撸Vue(Vue2 + TS +TSX+CSS module)
Vue对TS的支持一致不太好,连Vue作者尤大也自嘲真香压错了宝.期待Vue3.0会用TS重构且会有较大改进.不过目前有一些第三方的库可以曲线优化对TS的支持.主要就介绍下过下面两个库来写Vue. 总 ...
- 《Python黑帽子:黑客与渗透测试编程之道》 Windows下木马的常用功能
有趣的键盘记录: 安装pyHook: http://nchc.dl.sourceforge.net/project/pyhook/pyhook/1.5.1/pyHook-1.5.1.win32-py2 ...