做消息通信,消息会不断从网络流中取得,而后台也有线程不断消费。本来我一直是使用一些线程安全标识或方法来控制,后来在网上找到一些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。
请您到ITEYE看我的原创:http://cuisuqiang.iteye.com
或支持我的个人博客,地址:http://www.javacui.com
相关推荐
在Java并发编程中,阻塞队列和阻塞栈是两个重要的并发数据结构,它们在多线程环境下的高效通信和资源管理中扮演着至关重要的角色。这些数据结构源自Java的并发包`java.util.concurrent`,是实现并发设计模式如生产者...
Java线程:新特征-阻塞队列 Java线程:新特征-阻塞栈 Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器 Java线程:深入ThreadLocal 一、标准例子 二、不用ThreadLocal 三、自己...
7. LinkedBlockingDeque:基于链表的双向阻塞队列,既可以作为队列也可以作为栈使用。 在生产者-消费者场景下,BlockingQueue 能够确保生产者线程在队列满时不会过度生产,而消费者线程在队列为空时也不会过度消耗...
在复习过程中,考生还可以关注栈和队列的变体,如循环队列、优先队列(堆队列)、阻塞队列等,以及与它们相关的数据结构,如树、图等。结合实例和实际应用,能够帮助考生更全面地掌握这些基础知识,为考试做好充分...
- **定义**:阻塞队列是一种特殊的队列,除了具有队列的基本特性外,还提供了额外的阻塞行为,即当队列空时,从队列中获取元素的操作将会阻塞,等待队列变得非空;当队列满时,向队列插入元素的操作也会阻塞,等待...
3. **阻塞队列(BlockingQueue)**:`java.util.concurrent`包下的`BlockingQueue`接口扩展了Queue接口,并添加了线程安全的阻塞操作,如`put(E e)`、`take()`等。这些方法会在队列满时阻塞生产者,空时阻塞消费者,...
2. **数据结构与算法**:数据结构如数组、链表、栈、队列、树、图等是解决问题的关键。算法则涉及排序(如冒泡、选择、插入、快速、归并等)、查找(如二分查找、哈希查找)以及复杂问题的解决策略。这些知识点在...
本教程将深入探讨几个关键的Java高级特性,包括多线程、并发包下的队列、Java消息服务(JMS)、虚拟机(JVM)技术和反射与动态代理。下面将对这些主题进行详细的讲解。 1. **多线程**:Java提供了强大的多线程支持...
- 理解Java内存模型(JMM),包括堆内存、栈内存和方法区。 - 掌握对象的生命周期,包括创建、使用、垃圾回收。 - 了解几种常见的垃圾收集器,如Serial、ParNew、CMS、G1等,以及他们的工作原理和优缺点。 - ...
此外,NIO(非阻塞I/O)和AIO(异步I/O)也是现代Java开发中的重要知识点。 数据库操作是大多数互联网应用的基础,因此SQL语句的编写和优化、事务管理、索引原理、数据库设计原则等内容也是面试中不可或缺的部分。...
在Java笔试面试中,面试官通常会考察应聘者对Java基础知识、高级特性、框架以及中间件的掌握程度。以下是一些核心知识点的详细说明: 1. **Java基础**: - **JDK与JRE的区别**:JDK包含JRE,提供开发和运行Java...
4. **IO/NIO/BIO**:Java的输入输出流模型,包括字符流和字节流,以及非阻塞I/O(NIO)和BufferedReader、FileReader等类的使用。NIO中的通道、选择器、缓冲区等也是面试中的热门话题。 5. **反射**:Java反射机制...
7. **IO/NIO/BIO**:理解Java的输入输出模型,包括BufferedReader、FileInputStream等基本IO流,以及非阻塞IO(NIO)和BIO的区别和应用场景。 8. **网络编程**:理解TCP/IP协议,会编写Socket编程,了解HTTP协议,...
7. **IO流与NIO**:了解输入输出流的层次结构和分类,以及Java NIO(非阻塞I/O)的新特性。 8. **反射机制**:反射在Java中用于在运行时检查类、接口、字段和方法,是动态编程的关键。 9. **设计模式**:熟悉常见...
6. **IO/NIO/AIO**:介绍Java的输入输出流体系,包括字节流、字符流、缓冲流,以及NIO(New IO)的非阻塞I/O特性,包括通道(Channel)、缓冲区(Buffer)、选择器(Selector)等。可能还会提及AIO(Asynchronous IO...
在Java面试中,尤其是针对杭州阿里云的中级Java工程师岗位,深入理解和熟练应用Java核心技术是至关重要的。这个压缩包文件“java面试——杭州-阿里云-Java中级.zip”包含了一份详细的PDF文档,它可能涵盖了面试中常...
#### 十四、Java线程:新特征-阻塞队列与阻塞栈 - **阻塞队列**: - `BlockingQueue` 是一种特殊类型的队列,它提供了额外的阻塞行为。 - 当队列为空时,从队列中取元素的操作将会阻塞;当队列满时,往队列里添加...
- AIO(异步I/O):Java 7引入的新特性,处理高并发I/O场景。 4. **网络编程** - Socket编程:客户端和服务端的建立连接,数据传输。 - HTTP协议:理解HTTP请求和响应的结构,创建简单的HTTP服务器。 5. **设计...
本话题将深入探讨如何利用Java的多线程特性来实现消息的压入栈和从栈中取出,以及其在访问网络等实际应用场景中的运用。 首先,我们需要理解栈(Stack)这一数据结构。栈是一种后进先出(LIFO)的数据结构,它允许...
#### 十七、Java线程:新特征-阻塞队列 阻塞队列是一种特殊的队列,当队列为空时,从队列获取元素的操作会被阻塞;当队列满时,向队列插入元素的操作会被阻塞。阻塞队列常用于线程池中。 #### 十八、Java线程:新...