- 浏览: 211081 次
- 性别:
- 来自: 哈尔滨
文章分类
- 全部博客 (267)
- java.lang (8)
- 问题汇总 (21)
- 异常记录 (20)
- 功能实现 (19)
- 面试总结 (25)
- 技巧总结 (8)
- 常用代码 (4)
- 编程习惯 (3)
- 编码规则 (3)
- java.util (10)
- java.io (1)
- JavaWeb (9)
- MySQL (16)
- SVN (3)
- MyBatis (11)
- Velocity (7)
- 其他知识 (10)
- 人生哲理 (1)
- 人生故事 (1)
- 自我感悟 (1)
- shiro (3)
- 基础知识 (0)
- 问题总结 (1)
- Spring 标签 (1)
- Spring (3)
- 点滴生活 (1)
- DOS (1)
- CAS (4)
- Linux (9)
- Storm (6)
- Shell (1)
- regex (1)
- Collection (4)
- poi (1)
- 经典语句 (1)
- NIO (5)
- concurrent (14)
- RPC (1)
- zookeeper (3)
- 待整理 (2)
- Hadoop (9)
- RabbitMq (2)
- flume (1)
- hive (7)
- hbase (4)
- kafka (1)
- scala (1)
- GC (0)
- java.util.concurrent.atomic (1)
- java.lang.ref (6)
- JVM (2)
- algorithm (1)
- conception (1)
- java key word (1)
- sun.misc (1)
最新评论
参考内容:http://tool.oschina.net/apidocs/apidoc?api=jdk-zh
一、BlockingQueue
1.JDK-API说明
BlockingQueue 支持两个附加操作的 Queue,这两个操作是:获取元素时等待队列变为非空,以及存储元素时等待空间变得可用
说明:
生产者与消费者模式,正常情况下,一个生产,一个使用,不产生积压,也不缺货
异常情况下:
生产者速率高于消费者,供大于求,临时存放货物的空间不够用,再生产的东西没地方存放,即无法继续生产;
-- 此时需要阻塞生产者,让其等待,等消费者消费,有空间存放接下来的东西
-- 即存储元素时等待空间变得可用
生产者速率低于消费者,供不应求,临时存放货物的空间空着,即使想消费,也没有货物;
-- 此时需要阻塞消费者,让其等待生产者
-- 即获取元素时等待队列非空
2.
BlockingQueue 方法以四种形式出现,对于不能立即满足但可能在将来某一时刻可以满足的操作,这四种形式的处理方式不同:
第一种是抛出一个异常,
-- 操作时不符合规则的情况下,会抛出异常
第二种是返回一个特殊值(null 或 false,具体取决于操作),
-- 根据返回值判断此次操作是否成功
第三种是在操作可以成功前,无限期地阻塞当前线程,
-- 如:生产者需等待消费者消费直至有空余空间才会继续生产
第四种是在放弃前只在给定的最大时间限制内阻塞
-- 等待指定时间后,不再等待
二、ArrayBlockingQueue
1.
验证上面的方法
即:
异常:add / remove
返回值:offer / poll
阻塞:put / take
阻塞定时: offer / poll
2.
三、LinkedBlockingDeque
与 ArrayBlockingQueue类似
底层实现为链表,无需设置边界,默认为边界值为Integer.MaxValue
四、DelayBlockingQueue
为每个元素设置超时时间,若在超时间内未执行获取该元素的操作,则在执行该元素取出操作时进行判断,若超过超时时间了,该元素被认为无效
五、PriorityBlockingQueue
为在队列中的元素进行排序处理,即不按照FIFO的原则处理数据
六、SynchronizeBlockingQueue
同步队列,只允许存放一个元素
若队列中已有元素,存放操作需阻塞,直到元素被取出
七、BlockingDequeue
双端队列,在队列两侧均可操作
一、BlockingQueue
1.JDK-API说明
public interface BlockingQueue<E> extends Queue<E>
BlockingQueue 支持两个附加操作的 Queue,这两个操作是:获取元素时等待队列变为非空,以及存储元素时等待空间变得可用
说明:
生产者与消费者模式,正常情况下,一个生产,一个使用,不产生积压,也不缺货
异常情况下:
生产者速率高于消费者,供大于求,临时存放货物的空间不够用,再生产的东西没地方存放,即无法继续生产;
-- 此时需要阻塞生产者,让其等待,等消费者消费,有空间存放接下来的东西
-- 即存储元素时等待空间变得可用
生产者速率低于消费者,供不应求,临时存放货物的空间空着,即使想消费,也没有货物;
-- 此时需要阻塞消费者,让其等待生产者
-- 即获取元素时等待队列非空
2.
BlockingQueue 方法以四种形式出现,对于不能立即满足但可能在将来某一时刻可以满足的操作,这四种形式的处理方式不同:
第一种是抛出一个异常,
-- 操作时不符合规则的情况下,会抛出异常
第二种是返回一个特殊值(null 或 false,具体取决于操作),
-- 根据返回值判断此次操作是否成功
第三种是在操作可以成功前,无限期地阻塞当前线程,
-- 如:生产者需等待消费者消费直至有空余空间才会继续生产
第四种是在放弃前只在给定的最大时间限制内阻塞
-- 等待指定时间后,不再等待
抛出异常 | 特殊值 | 阻塞 | 超时 | |
插入 | add(e) | offer(e) | put(e) | offer(e, time, unit) |
移除 | remove() | poll() | take() | poll(time, unit) |
检查 | element() | peek() | 不可用 | 不可用 |
二、ArrayBlockingQueue
1.
验证上面的方法
- 存放数据,超过指定长度
- 取出数据,数据为空
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.TimeUnit; public class BlockingQueueDemo { /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { // 接口实现,ArrayBlocking 实质为数据,即有容量大小的限制,需使用前指定 BlockingQueue<String> queue = new ArrayBlockingQueue<String>(5); // inPutQueue(queue); // outPutQueue(queue); } public static void outPutQueue(BlockingQueue<String> blockingQueue) throws InterruptedException { // remove 方法 -- 抛出异常 // 此时队列为空,无数据可供取出 // Exception in thread "main" java.util.NoSuchElementException // blockingQueue.remove(); // poll 方法 -- 返回值 // 返回取出的数据 String operationReult = blockingQueue.poll(); System.out.println(operationReult); // take 方法 -- 阻塞 blockingQueue.take(); // poll 方法 -- 阻塞一定时间 blockingQueue.poll(3, TimeUnit.SECONDS); } public static void inPutQueue(BlockingQueue<String> blockingQueue) throws InterruptedException{ blockingQueue.add("a"); blockingQueue.add("a"); blockingQueue.add("a"); blockingQueue.add("a"); blockingQueue.add("a"); // add 方法 -- 操作失败抛出异常 // 执行下面代码时异常,以存放5个,再次存放,提示队列已满 -- 类比:数组越界,超过了数组的最大容量 // Exception in thread "main" java.lang.IllegalStateException: Queue full // queue.add("a"); // offer 方法 -- 操作失败有特殊的返回值 // 不同于 add 同样是队列已满,但不抛出异常,接收返回值,结果为 false -- 添加失败 // boolean operatonResult = queue.offer("a"); // System.out.println(operatonResult); // put 方法 -- 阻塞程序运行 // 抛出异常 // 运行 -- 程序无法继续走下去,无法结束,阻塞到此行 // blockingQueue.put("a"); // offer("",time,time-unit) -- 阻塞指定时间 // 运行 -- 程序阻塞,3秒后正常结束 // blockingQueue.offer("a", 3L, TimeUnit.SECONDS); } }
即:
异常:add / remove
返回值:offer / poll
阻塞:put / take
阻塞定时: offer / poll
2.
/** * 模拟消费者与生产者 * 队列容量为5 * 生产者 每隔1s,放进一个数据 * 消费者 每个3s,读取一个数据 * 若使用:add remove 则会抛出 queue full 的异常 * 若使用:put take 则程序正常执行,会出现短暂的阻塞 */ public class BlockingQueueDemo1 { /** * @param args */ public static void main(String[] args) { // 底层实现是数组,必须是有界限 BlockingQueue<String> queue = new ArrayBlockingQueue<String>(5); // 底层是链表,若未设置大小,默认大小为Integer.Max_value // BlockingQueue<String> queue = new LinkedBlockingDeque<String>(5); new Thread(new Producer(queue)).start(); new Thread(new Consumer(queue)).start(); } } class Producer implements Runnable{ private BlockingQueue<String> queue ; public Producer(){ } public Producer(BlockingQueue<String> queue){ this.queue = queue ; } @Override public void run() { for(int i = 0 ; i< 100 ; i++){ try { queue.put(String.valueOf(i)); System.out.println("生产者--生产:"+i); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Consumer implements Runnable{ private BlockingQueue<String> queue ; public Consumer(){ } public Consumer(BlockingQueue<String> queue){ this.queue = queue ; } @Override public void run() { for(int i = 0 ; i < 100 ; i++){ try { queue.take(); System.out.println("消费者--消费:"+i); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
三、LinkedBlockingDeque
与 ArrayBlockingQueue类似
底层实现为链表,无需设置边界,默认为边界值为Integer.MaxValue
四、DelayBlockingQueue
为每个元素设置超时时间,若在超时间内未执行获取该元素的操作,则在执行该元素取出操作时进行判断,若超过超时时间了,该元素被认为无效
五、PriorityBlockingQueue
为在队列中的元素进行排序处理,即不按照FIFO的原则处理数据
六、SynchronizeBlockingQueue
同步队列,只允许存放一个元素
若队列中已有元素,存放操作需阻塞,直到元素被取出
七、BlockingDequeue
双端队列,在队列两侧均可操作
发表评论
-
Queue
2017-08-21 21:26 466Queue 一、Queue ConcurrentLink ... -
容器集合
2017-08-19 18:18 407容器 一、同步类容器 1.概念 同步类容器都是线程安全的, ... -
多线程-单例模式
2017-08-17 20:59 358单例模式 一、概念 饿汉模式、懒汉模式 二、示例 ... -
ThreadLocal
2017-08-17 21:02 300ThreadLocal 一、概念 ThreadLocal ... -
线程间通信 wait notify
2017-08-15 22:12 436线程间通信 一、通信 线程通信概念:线程是操作系统中独立的 ... -
Volatile
2017-08-14 22:11 401Volatile 一、概念 volatile : 作用是保 ... -
Synchronized
2017-08-13 18:46 414Synchronized 一、锁重入 1.概念 关键字 s ... -
脏读(数据)
2017-08-13 17:47 441脏读 一、概念 数据写入与数据读出不一致 原因:未对写入 ... -
线程安全
2017-08-12 20:55 392线程安全 一、线程安全 线程安全概念: 当多个线程访问某一 ... -
Lock
2017-04-19 22:39 512Lock 一、 1. public class ... -
ExecutorService
2017-04-17 22:32 786ExecutorService 1. 线程池的意义: 维护一 ... -
CountDownLatch
2017-04-16 12:38 443一、CountDownLatch 一个同步辅助类,在完成一组 ... -
ConcurrentHashMap
2017-04-16 11:01 347一、 hashMap线程不安全hashTable线程安全,对 ...
相关推荐
在Java编程中,`BlockingQueue`是一个非常重要的并发工具类,它主要用于线程间的数据通信。`newFixedThreadPool`是`java.util.concurrent`包中的一个线程池工厂方法,用于创建固定数量线程的线程池。`FutureTask`则...
### 线程与BlockingQueue知识点详解 #### 1. BlockingQueue简介 `BlockingQueue`是一种特殊类型的队列,主要用于多线程环境中的任务管理。它具有以下特性:当队列为空时,从队列中获取元素的操作会被阻塞;同样地,...
《C++实现的跨平台BlockingQueue详解》 在软件开发中,线程间的通信和同步是必不可少的部分。Java中的`BlockingQueue`是一个高效且常用的并发工具类,它提供了线程安全的数据结构,允许一个线程放入元素,而另一个...
### BlockingQueue(阻塞队列)详解 #### 一、前言 随着现代软件系统对并发性能需求的不断提高,多线程编程技术逐渐成为开发人员不可或缺的技能之一。在Java平台中,`java.util.concurrent`包提供了丰富的工具来...
阻塞队列(BlockingQueue)是一种特殊的队列,它支持两个附加操作:阻塞的插入方法put和阻塞的移除方法take。BlockingQueue继承了Queue接口,是Java 5中加入的。 BlockingQueue常用方法示例: 1. add(E e):添加一...
BlockingQueue是Java并发编程中非常重要的一个数据结构,它是一个具有阻塞特性的队列,主要用于线程间的协作。在多线程环境下,BlockingQueue能够有效地实现生产者-消费者模式,提高了程序的并发性能和效率。本文将...
在Java并发编程中,BlockingQueue是一个非常重要的接口,它提供了线程安全的队列操作,特别是在生产者-消费者模式中发挥着核心作用。本文将深入探讨BlockingQueue的工作原理、常见实现、使用场景以及代码示例。 在...
BlockingQueue是Java并发编程中非常重要的一个接口,它在`java.util.concurrent`包下,是线程安全的队列,主要用于解决生产者-消费者问题。BlockingQueue的主要特点是当队列满时,生产者线程会被阻塞,直到队列有...
Java 并发集合:ConcurrentHashMap 和 BlockingQueue Java 并发集合是 Java 语言中的一种高级hread-safe 集合框架,用于在多线程环境中实现高效、安全的数据存储和访问。其中,ConcurrentHashMap 和 BlockingQueue ...
【Java并发编程--BlockingQueue详解】 BlockingQueue 是 Java 并发包(java.util.concurrent)中的一个接口,它扩展了 Queue 接口,并引入了线程安全的特性,特别适合于多线程环境下的数据共享。 BlockingQueue 的...
在Java编程中,`BlockingQueue`(阻塞队列)是一种重要的并发工具,它结合了队列的数据结构和线程同步机制。`BlockingQueue`接口位于`java.util.concurrent`包中,提供了线程安全的数据结构,可以用于实现生产者-...
在Java编程中,`BlockingQueue`是一个非常重要的并发容器,它是Java并发包`java.util.concurrent`中的核心组件。`BlockingQueue`实现了一种线程安全的数据结构,它能够有效地协调生产者和消费者的动作,实现高效的...
Java中的`BlockingQueue`接口是Java并发编程的重要组件,它位于`java.util.concurrent`包下,主要用于线程间数据的同步和通信。`BlockingQueue`是一个支持线程安全的队列,它允许一个线程放入(插入)元素,而另一个...
阻塞队列BlockingQueue是Java并发编程中一个重要的数据结构,它是线程安全的队列,主要用于生产者消费者模型中的数据交换。在Java的`java.util.concurrent`包中,提供了多种实现阻塞队列的类,如`ArrayBlockingQueue...
标题 "2011.08.30(2)——— java BlockingQueue ExecutorService" 涉及到Java并发编程中的两个核心组件:BlockingQueue(阻塞队列)和ExecutorService。这篇博客可能深入探讨了如何使用这两个工具来优化多线程环境...
—BlockingQueue和ArrayBlockingQueue.pdf” 【描述】:此文档是关于Java并发编程的学习资料,以漫画形式讲解,聚焦于Java并发编程中的核心概念——BlockingQueue接口及其具体实现ArrayBlockingQueue。 【标签】:...
当我们谈论"Spring BlockingQueue"时,我们实际上是在讨论如何在Spring Boot应用中使用Java并发库中的BlockingQueue接口。 BlockingQueue是一种线程安全的数据结构,它在多线程环境下的数据共享和通信中扮演着关键...
### 10、阻塞队列BlockingQueue 实战及其原理分析 #### 一、阻塞队列概述 阻塞队列(BlockingQueue)是Java语言中`java.util.concurrent`包下提供的一种重要的线程安全队列。它继承自`Queue`接口,并在此基础上...
Conversant ConcurrentQueue、Disruptor BlockingQueue 和 ConcurrentStack Disruptor是Java中性能最高的线程内传输机制。 Conversant Disruptor 是这种环形缓冲区中性能最高的实现,因为它几乎没有开销,并且采用了...