`
cuisuqiang
  • 浏览: 3962715 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
3feb66c0-2fb6-35ff-968a-5f5ec10ada43
Java研发技术指南
浏览量:3672090
社区版块
存档分类
最新评论

阻塞队列和阻塞栈

    博客分类:
  • JDK
阅读更多

阻塞队列
阻塞队列是Java5并发新特性中的内容,阻塞队列的接口是java.util.concurrent.BlockingQueue,它有多个实现类:ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等,用法大同小异,具体可查看JDK文档,这里简单举例看下ArrayBlockingQueue,它实现了一个有界队列,当队列满时,便会阻塞等待,直到有元素出队,后续的元素才可以被加入队列

package test;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class BlockingQueueTest {
 @SuppressWarnings("unchecked")
 public static void main(String[] args) throws InterruptedException {
  BlockingQueue bqueue = new ArrayBlockingQueue(10);
  for (int i = 1; i < 30; i++) {
   bqueue.put(i);
   System.out.println("阻塞队列添加元素:" + i);
  }
  System.out.println("----程序结束----");
 }
}

 

输出到元素19时候,就一直处于等待状态。这里没有用多线程来演示,没有这个必要
阻塞队列提供了四种处理方法:

方法\处理方式 抛出异常 返回特殊值 一直阻塞 超时退出
插入方法 add(e) offer(e) put(e) offer(e,time,unit)
移除方法 remove() poll() take() poll(time,unit)
检查方法 element() peek() 不可用 不可用

抛出异常:是指当阻塞队列满时候,再往队列里插入元素,会抛出IllegalStateException(“Queue full”)异常。当队列为空时,从队列里获取元素时会抛出NoSuchElementException异常 。
返回特殊值:插入方法会返回是否成功,成功则返回true。移除方法,则是从队列里拿出一个元素,如果没有则返回null
一直阻塞:当阻塞队列满时,如果生产者线程往队列里put元素,队列会一直阻塞生产者线程,直到拿到数据,或者响应中断退出。当队列空时,消费者线程试图从队列里take元素,队列也会阻塞消费者线程,直到队列可用。
超时退出:当阻塞队列满时,队列会阻塞生产者线程一段时间,如果超过一定的时间,生产者线程就会退出。

JDK6提供了6个阻塞队列:
ArrayBlockingQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue

 

阻塞栈
阻塞栈与阻塞队列相似,只是它是Java 6中加入的新特性,阻塞栈的接口java.util.concurrent.BlockingDeque也有很多实现类,使用方法也比较相似

package test;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
// 注意使用JDK6
public class BlockingDequeTest {
 @SuppressWarnings("unchecked")
 public static void main(String[] args) {
  BlockingDeque deque = new LinkedBlockingDeque(10);
  for (int i = 0; i < 30; i++) {
   try {
    //deque.addFirst(i); // 使用addFirst满时报错
    deque.putFirst(i);
    //deque.addLast(i); // 向尾部增加
    //deque.putLast(i);
   } catch (Exception e) {
    e.printStackTrace();
   }
   System.out.println("阻塞栈添加元素:" + i);
  }
  System.out.println("----程序结束----");
 }
}

 

效果是一致的,只是我们看到的是栈的特性!

 

请您到ITEYE网站看 java小强 原创,谢谢!

http://cuisuqiang.iteye.com/ 

自建博客地址:http://www.javacui.com/ ,内容与ITEYE同步!

分享到:
评论

相关推荐

    Java并发编程(21)并发新特性-阻塞队列和阻塞栈(含代

    它同时具备队列和栈的特点,允许在两端进行插入和删除操作。与阻塞队列类似,当栈为空或满时,操作会阻塞,从而实现了线程间的同步。 **并发新特性** 随着Java版本的更新,其并发库也不断优化和完善。例如,Java 5...

    支持多线程和泛型的阻塞队列

    4. **阻塞与唤醒机制**:在`push()`和`pop()`等方法中使用条件变量来实现阻塞和唤醒操作。 ### 应用场景 阻塞队列在许多并发编程场景中都有应用,例如: 1. **线程池**:任务调度器将任务放入队列,工作线程从...

    阻塞队列阻塞队列阻塞队列

    在Java编程语言中,阻塞队列是一种线程安全的数据结构,它在多线程并发控制中发挥着重要作用。阻塞队列的核心特性是当队列为空时,尝试...了解和掌握这些阻塞队列的特性和使用方法,对于优化并发程序的性能至关重要。

    并发-线程池和阻塞队列.pdf

    线程池和阻塞队列是实现并发的关键组件之一。本文将详细介绍线程池原理、使用场景及注意事项,以及阻塞队列的相关知识。 首先,线程池是一种基于池化思想管理线程的技术,它可以重用一组线程执行多个任务。线程池的...

    14-阻塞队列BlockingQueue实战及其原理分析二.pdf

    阻塞队列(BlockingQueue)是一种特殊的队列,它支持两个附加操作:阻塞的插入方法put和阻塞的移除方法take。BlockingQueue继承了Queue接口,是Java 5中加入的。 BlockingQueue常用方法示例: 1. add(E e):添加一...

    c++11 实现的阻塞队列

    阻塞队列的实现需要解决两个问题:线程安全和阻塞机制。在 C++11 中,我们可以使用 std::mutex、std::condition_variable 和 std::queue 等标准库来实现阻塞队列。 阻塞队列的实现需要注意以下几点: 1. 线程安全...

    java模拟阻塞队列

    Java中的阻塞队列是一种基于同步原语的高级数据结构,它在多线程编程中扮演着重要角色,尤其在并发处理和优化系统资源利用率方面。阻塞队列结合了队列的数据结构与线程同步机制,使得生产者可以在队列满时被阻塞,而...

    并发-线程池和阻塞队列

    在Java编程中,"并发-线程池和阻塞队列"是两个核心概念,它们在多线程环境下处理任务调度和数据同步方面发挥着重要作用。线程池是一种管理线程资源的有效方式,而阻塞队列则常用于线程间通信和数据共享。 线程池...

    BlockingQueue(阻塞队列)详解

    - **缓存管理**:在有限容量的缓存中,阻塞队列可以帮助实现缓存数据的高效更新和管理。 **4. 阻塞队列的优点** - **线程安全性**:内置线程安全机制,无需手动实现同步。 - **自动阻塞与唤醒**:当队列满时,...

    Java实现简单的阻塞队列2种方式

    本文将探讨两种实现简单阻塞队列的方法:使用`wait()`和`notify()`以及使用`CountDownLatch`。 1. 使用`wait()`和`notify()`: `wait()`和`notify()`是Java中`Object`类的方法,它们是线程间通信的核心。在同步...

    生产者/消费者模式 阻塞队列 LinkedBlockingQueue

    了解并熟练运用生产者/消费者模式以及像LinkedBlockingQueue这样的阻塞队列,对于优化多线程程序的性能和简化并发编程的复杂性至关重要。在阅读《xiongjiajia.iteye.com/blog/2325943》这篇博客文章时,你可以深入...

    剖析Java中阻塞队列的实现原理及应用场景

    阻塞队列和非阻塞队列的主要区别在于处理满队列和空队列的情况。非阻塞队列如`LinkedList`和`PriorityQueue`在队列满或空时,会立即返回结果,而阻塞队列则会阻塞等待直到条件满足。 对于非阻塞队列,常用的方法如`...

    java线程大总结.pdf

    在这个大总结中,我们将重点关注Java中的两种重要并发工具:信号量(Semaphore)和阻塞队列(BlockingQueue),以及相关的阻塞栈(BlockingDeque)。 首先,信号量是一个用于控制对共享资源访问的计数器。它允许...

    10、阻塞队列BlockingQueue实战及其原理分析.pdf

    ### 10、阻塞队列BlockingQueue 实战及其原理分析 #### 一、阻塞队列概述 阻塞队列(BlockingQueue)是Java语言中...通过对不同阻塞队列实现的理解和掌握,可以更好地设计和优化高并发系统,提升系统的稳定性和性能。

    java线程聊天室(阻塞队列实现)

    生产者线程(如用户发送消息的线程)将消息放入阻塞队列,而消费者线程(如处理和分发消息的线程)从队列中取出消息。通过这种方式,生产者和消费者可以异步工作,提高系统吞吐量。 登录机制是聊天室的重要组成部分...

    阻塞队列(Blocking Queue)是一个支持两个附加操作的队列.txt

    阻塞队列是Java中并发编程的一个重要组件,它属于Java.util.concurrent包中的一部分。...使用阻塞队列能够极大地简化生产者和消费者模型的实现,并且能够在多线程环境中更加有效地管理资源和任务。

    高性能阻塞队列的数据结构创新.pptx

    综上所述,通过对传统阻塞队列的分析及其性能瓶颈的探讨,我们了解到无锁队列和优化后的数组阻塞队列以及链表阻塞队列在提高并发性能、降低延迟、提高可扩展性和降低复杂性等方面的优势。这些改进措施对于提升软件...

    10、阻塞队列BlockingQueue实战及其原理分析

    阻塞队列的实现基于`Lock`和`Condition`机制,其中`Lock`用于控制对队列的访问,`Condition`用于实现阻塞和唤醒功能。例如,`ArrayBlockingQueue`使用`ReentrantLock`作为锁,并通过两个条件变量`notEmpty`和`not...

    java阻塞队列实现原理及实例解析.docx

    总结来说,Java阻塞队列是一种强大的并发工具,它通过自动阻塞和唤醒线程来实现线程间的同步,简化了多线程编程的复杂性。在Java `java.util.concurrent`包中提供了多种优化的阻塞队列实现,适用于不同的并发需求。...

    阻塞队列实现生产者消费者模式Java开发Java经验技巧共

    1. **阻塞队列接口**:首先,会介绍`BlockingQueue`接口,它的核心方法如`put()`用于生产者插入元素,`take()`用于消费者取出元素,这些方法会自动处理线程的阻塞和唤醒。 2. **队列实现**:接着可能会讲解几种具体...

Global site tag (gtag.js) - Google Analytics