【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 ...
随机推荐
- ExtJS+SpringMVC文件上传与下载
说到文件上传.下载功能,网络上大多介绍的是采用JSP.SpringMVC或者Struts等开源框架的功能,通过配置达到文件上传.下载的目地.可是最近项目要用到文件上传与下载的功能,因为本项目框架采用开 ...
- IntelliJ IDEA 2017版 spring-boot使用JdbcTemplate实例
搭建总框架: (1)在pom.xml加入jdbcTemplate的依赖: (2)编写Dao类,声明为:@Repository,引入JdbcTemplate (3)编写Service类,引入Dao进行使 ...
- java中的实例化
java中的new用于实例化一个对象 T1 a= new T1(); T2 b= new T1(); 区别: 问题1:不是实例化一个a,是实例化一个T1 T1 的一个 对象的引用 a 指向了堆空间里的 ...
- Windows could not set the offline local information.Error code:0X80000001解决方法
我的笔记本是联想Y460(白色) 昨天在重装系统的时候遇到如下错误:Windows could not set the offline local information.Error code:0X8 ...
- (网络流) Island Transport --Hdu -- 4280
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4280 源点是West, 汇点是East, 用Dinic带入求就好了 代码:要用c++提交 #pragma ...
- C++中的浮点数运算的误差测试分析
C++中的浮点数运算的误差 项目中需要计算判定,采用的是float型,如: float a < yLing, 其中:a = 2.0, y则从1.0 + 0.2*n 当n = 4时,条件成立了? ...
- word中添加引文操作
word中添加引文操作 转化为pdf的时候,可以通过引文处进行ctrl + 左键点击,挑战到相应的后文中的参考引文位置. 1.在文章末尾添加如下内容,并在他的下面添加一条被引文的格式
- hdu 1799 循环多少次?
题目 题意:给出n,m,其中m表示有几层循环,求循环的次数 ①如果代码中出现 for(i=1;i<=n;i++) OP ; 那么做了n次OP运算: ②如果代码中出现 fori=1;i<=n ...
- 快速排序—三路快排 vs 双基准
快速排序被公认为是本世纪最重要的算法之一,这已经不是什么新闻了.对很多语言来说是实际系统排序,包括在Java中的Arrays.sort. 那么快速排序有什么新进展呢? 好吧,就像我刚才提到的那样(Ja ...
- [label][翻译][JavaScript Regular Expression]JavaScript Regular Expressions
原文:http://www.javascriptkit.com/javatutors/re.shtml 校验用户的输入是每一个软件开发者的必须要做的事情. 正则表达式与模式 如何在JavaScript ...