当前位置:首页 > 开发 > 编程语言 > Java > 正文

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

发表于: 2012-03-20   作者:cuisuqiang   来源:转载   浏览次数:
摘要: 做消息通信,消息会不断从网络流中取得,而后台也有线程不断消费。本来我一直是使用一些线程安全标识或方法来控制,后来在网上找到一些java新特性,里面包含了可以用到的堆栈使用,而且是堵塞的,这样至少可以保证一些安全性。   对于堆: BlockingQueue 不接受 null 元素。试图 add、put 或 offer 一个 null 元素时,某些实现会抛出 NullPointerE

做消息通信,消息会不断从网络流中取得,而后台也有线程不断消费。本来我一直是使用一些线程安全标识或方法来控制,后来在网上找到一些java新特性,里面包含了可以用到的堆栈使用,而且是堵塞的,这样至少可以保证一些安全性。

 

对于堆:

BlockingQueue 不接受 null 元素。试图 addputoffer 一个 null 元素时,某些实现会抛出 NullPointerExceptionnull 被用作指示 poll 操作失败的警戒值。

BlockingQueue 可以是限定容量的。它在任意给定时间都可以有一个 remainingCapacity,超出此容量,便无法无阻塞地 put 附加元素。没有任何内部容量约束的 BlockingQueue 总是报告 Integer.MAX_VALUE 的剩余容量。

BlockingQueue 实现主要用于生产者-使用者队列,但它另外还支持 Collection接口。因此,举例来说,使用 remove(x) 从队列中移除任意一个元素是有可能的。然而,这种操作通常 会有效执行,只能有计划地偶尔使用,比如在取消排队信息时。

BlockingQueue 实现是线程安全的。所有排队方法都可以使用内部锁或其他形式的并发控制来自动达到它们的目的。然而,大量的 Collection 操作(addAllcontainsAllretainAllremoveAll没有 必要自动执行,除非在实现中特别说明。因此,举例来说,在只添加了 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 方法有四种形式,使用不同的方式处理无法立即满足但在将来某一时刻可能满足的操作:第一种方式抛出异常;第二种返回一个特殊值(nullfalse,具体取决于操作);第三种无限期阻塞当前线程,直至操作成功;第四种只阻塞给定的最大时间,然后放弃。

看一个例子:

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。

 

请您到ITEYE看我的原创:http://cuisuqiang.iteye.com

或支持我的个人博客,地址:http://www.javacui.com

 

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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
Java集合之队列 队列Queue Queue是Java中的一个接口,继承自Collection接口。 public interface Que
栈实现代码: /** * 自定义栈 * @author zm * 注意体会 pop()的arr[top--] 和 push(long num)方法的
一、 栈 1、概念 栈是一种特殊的线性表,它只能在栈顶(top)进行插入(push)和删除(pop)操作。   栈
1.首先增强for循环和iterator遍历的效果是一样的,也就说增强for循环的内部也就是调用iteratoer实现
栈的定义:栈是一种特殊的表这种表只在表头进行插入和删除操作。因此,表头对于栈来说具有特殊的意
Java 7 正式版已经发布,来看看新特性。(转载自OSChina) Java 7 的架构图: 新特性一览表: Swing
Java 7 正式版已经发布,来看看新特性。(转载自OSChina) Java 7 的架构图: 新特性一览表: Swing
一、注解是jdk1.5后加入的新特性,jdk自带的Annotation类主要有三个: @SuppressWarnings,可用于隐藏
栈和队列----功能弱化的线性表(功能受到限制,比方说增删只能在首尾) (广度优先遍历的时候用到队列
栈和队列 浅谈算法和数据结构: 一 栈和队列 最近晚上在家里看Algorithems,4th Edition,我买的英文
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号