手机端小强原创文章,java小强个人博客站点
当前位置: 首页 >> 理论 >> Java新特性之-堵塞的队列和栈

Java新特性之-堵塞的队列和栈

26000 理论 | 2014-9-16

做消息通信,消息会不断从网络流中取得,而后台也有线程不断消费。本来我一直是使用一些线程安全标识或方法来控制,后来在网上找到一些java新特性,里面包含了可以用到的堆栈使用,而且是堵塞的,这样至少可以保证一些安全性。
 
对于堆:
BlockingQueue 不接受 null 元素。试图 add、put 或 offer 一个 null 元素时,某些实现会抛出 NullPointerException。null 被用作指示 poll 操作失败的警戒值。
BlockingQueue 可以是限定容量的。它在任意给定时间都可以有一个 remainingCapacity,超出此容量,便无法无阻塞地 put 附加元素。没有任何内部容量约束的 BlockingQueue 总是报告 Integer.MAX_VALUE 的剩余容量。
BlockingQueue 实现主要用于生产者-使用者队列,但它另外还支持 Collection接口。因此,举例来说,使用 remove(x) 从队列中移除任意一个元素是有可能的。然而,这种操作通常不 会有效执行,只能有计划地偶尔使用,比如在取消排队信息时。
BlockingQueue 实现是线程安全的。所有排队方法都可以使用内部锁或其他形式的并发控制来自动达到它们的目的。然而,大量的 Collection 操作(addAll、containsAll、retainAll 和 removeAll)没有 必要自动执行,除非在实现中特别说明。因此,举例来说,在只添加了 c 中的一些元素后,addAll(c) 有可能失败(抛出一个异常)。

 

看一段代码:

package com.test;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
 * @说明 堵塞队列和栈的使用
 */
public class Test {
 @SuppressWarnings("unchecked")
 public static void main(String[] args) throws InterruptedException {
  BlockingQueue bqueue = new ArrayBlockingQueue(5);
  for (int i = 0; i < 10; i++) {
   // 添加元素到队列,如果没有可用空间,将一直等待(如果有必要)
   bqueue.put(i);
   System.out.println("添加了元素:" + i);
  }
  System.out.println("----End----");
 }
}

运行效果:

添加了元素:0
添加了元素:1
添加了元素:2
添加了元素:3
添加了元素:4

之后就会一直等待。

 

对于栈:
BlockingDeque 方法有四种形式,使用不同的方式处理无法立即满足但在将来某一时刻可能满足的操作:

第一种方式抛出异常;

第二种返回一个特殊值(null 或 false,具体取决于操作);

第三种无限期阻塞当前线程,直至操作成功;

第四种只阻塞给定的最大时间,然后放弃。

 

看一个例子:

package com.test;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
/**
 * @说明 堵塞队列和栈的使用
 */
public class Test {
 @SuppressWarnings("unchecked")
 public static void main(String[] args) throws InterruptedException {
  BlockingDeque bDeque = new LinkedBlockingDeque(5);
  for (int i = 0; i < 10; i++) {
   // 将指定元素添加到此阻塞栈中,如果没有可用空间,将一直等待(如果有必要)。
   bDeque.putFirst(i);
   System.out.println("添加了元素:" + i);
  }
  System.out.println("----End----");
 }
}

运行结果和堆一样,也会产生等待。

 

对于两者的解释:
阻塞队列的概念是,一个指定长度的队列,如果队列满了,添加新元素的操作会被阻塞等待,直到有空位为止。

同样,当队列为空时候,请求队列元素的操作同样会阻塞等待,直到有可用元素为止。
对于阻塞栈,与阻塞队列相似。不同点在于栈是“后入先出”的结构,每次操作的是栈顶,而队列是“先进先出”的结构,每次操作的是队列头。


注意的是,BlockingQueue是5中的特性,jdk6以后才增加了BlockingDeque

推荐您阅读更多有关于“ 网络 通信 新特性 BlockingQueue BlockingDeque 阻塞队列 ”的文章

上一篇:Linux 使用脚本安装MySQL数据库 下一篇:Java中通过反射获得对象的属性信息

猜你喜欢

发表评论:

个人资料
blogger

java小强
没有思考,人生的路会越走越难!

搜索
分类
最新微语
  • 车也学了,年也过了,生日也过了,村里的会也赶了,这次,是真的,年过去了。不过我没回京,也没有在家找工作,我在等什么吗?反正现在正合了我这个懒人的要求,不过,我歇不住,思考下人生。

    2018-03-20 00:11

  • 8月1日,我已离开奋斗多年的北京。不知道是暂时的离开,还是永久的离别,反正已经离职在家,告别每日上班,每天苦累的煎熬,过一段属于自己的生活。以前是专职工作,现在专职生活。

    2017-08-18 12:47

  • 又弄完一个项目,累成狗,但是感觉又进步不少,除了很多坑已经踩过,做起来也是轻车熟路。同时也认识到,程序不在于你多牛逼,而是在乎你的细节把控度,而细节的关注,是一个优秀程序员必须要注意的。另外,要相信自己,勇敢向前,没人生下来就是成功的,而且,成功的路,比成功本身更重要。

    2017-06-30 09:46

  • 今日北京再次沙尘暴来袭,吃了几年细粮,终于能来口粗粮了,不过大早上看见这场景,还是吓我一跳,不过随后就平静了,毕竟是老朋友了。进公司又发现一股烤糊的味道,真是祸不单行啊,例外都是污染。发了两个口罩,开启保护模式。

    2017-05-04 10:16

  • 今天同学问我,最近还在写代码吗?我想了想,这个问题怎么回答呢,我好像确实很长时间,虽然写了一些,但是主要内容已经不是写代码了。然后再想想,自己也7年多了,这么多年了,我收获了什么,我的目标到底是什么。眼看就奔三了,人生啊,开启感叹模式。

    2017-03-30 22:52

  • 更多»

最新文章
热门文章
随机文章