- 浏览: 582093 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (253)
- java (84)
- python (22)
- 设计模式 (12)
- 数据结构和算法 (7)
- ibatis (1)
- 数据挖掘 (2)
- 集体智慧读书笔记 (1)
- ubuntu (4)
- lucene (11)
- 算法 第4版 (11)
- apache mina (16)
- memcached (1)
- android (9)
- netty (6)
- mongodb (2)
- maven (2)
- openfire (2)
- 服务端 (21)
- 产品 (0)
- apache (1)
- 选择 (2)
- 构架WEB高性能站点 (7)
- redis (8)
- 诗词歌赋 (3)
- 源代码阅读 (5)
- 前端 (1)
- javascript (3)
- guice (1)
- 分布式 (5)
- 总结-2014 (4)
- jvm (1)
最新评论
-
liu_jiaqiang:
写的挺好
maven多项目管理 -
H972900846:
我想知道哪里整的,如果是自己写的,那有点牛呀如果是抄的请说明出 ...
SSL身份认证原理 -
春天好:
博主写的很好,赞一个,多谢分享 *(^-^*)分享一个免费好用 ...
定向网站爬虫---初级例子 -
fenglingabc:
经过测试,parameterType="java.u ...
mybatis获取主键和存储过程返回值 -
jyghqpkl:
[u][/u] ...
Cookie的secure 属性
本文转载:http://blog.csdn.net/zlb824/article/details/7091814
本例介绍一个特殊的队列:BlockingQueue,如果BlockingQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒,同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间时才会被唤醒继续操作。
本例再次实现前面介绍的篮子程序,不过这个篮子中最多能放得苹果数不是1,可以随意指定。当篮子满时,生产者进入等待状态,当篮子空时,消费者等待。
BlockingQueue定义的常用方法如下:
add(anObject):把anObject加到BlockingQueue里,如果BlockingQueue可以容纳,则返回true,否则抛出异常。
offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false。
put(anObject):把anObject加到BlockingQueue里,如果BlockingQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里有空间再继续。
poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null。
take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到BlockingQueue有新的对象被加入为止。
BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类:
ArrayBlockingQueue:规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小。其所含的对象是以FIFO(先入先出)顺序排序的。
LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定。其所含的对象是以FIFO顺序排序的。
PriorityBlockingQueue:类似于LinkedBlockingQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数所带的Comparator决定的顺序。
SynchronousQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成的。
LinkedBlockingQueue和ArrayBlockingQueue比较起来,它们背后所用的数据结构不一样,导致LinkedBlockingQueue的数据吞吐量要大于ArrayBlockingQueue,但在线程数量很大时其性能的可预见性低于ArrayBlockingQueue。
- import java.util.concurrent.ArrayBlockingQueue;
- import java.util.concurrent.BlockingQueue;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- /** *//**
- * BlockingQueue是一种特殊的Queue,若BlockingQueue是空的,
- * 从BlockingQueue取东西的操作将会被阻断进入等待状态直到BlocingkQueue进了新货才会被唤醒。
- * 同样,如果BlockingQueue是满的任何试图往里存东西的操作也会被阻断进入等待状态,
- * 直到BlockingQueue里有新的空间才会被唤醒继续操作。
- * BlockingQueue提供的方法主要有:
- * add(anObject): 把anObject加到BlockingQueue里,如果BlockingQueue可以容纳返回true,否则抛出IllegalStateException异常。
- * offer(anObject):把anObject加到BlockingQueue里,如果BlockingQueue可以容纳返回true,否则返回false。
- * put(anObject):把anObject加到BlockingQueue里,如果BlockingQueue没有空间,调用此方法的线程被阻断直到BlockingQueue里有新的空间再继续。
- * poll(time):取出BlockingQueue里排在首位的对象,若不能立即取出可等time参数规定的时间。取不到时返回null。
- * take():取出BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到BlockingQueue有新的对象被加入为止。
- *
- * 根据不同的需要BlockingQueue有4种具体实现:
- * (1)ArrayBlockingQueue:规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小。其所含的对象是以FIFO(先入先出)顺序排序的。
- * (2)LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,
- * 若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定。其所含的对象是以FIFO(先入先出)顺序排序的。
- * LinkedBlockingQueue和ArrayBlockingQueue比较起来,它们背后所用的数据结构不一样,
- * 导致LinkedBlockingQueue的数据吞吐量要大于ArrayBlockingQueue,但在线程数量很大时其性能的可预见性低于ArrayBlockingQueue。
- * (3)PriorityBlockingQueue:类似于LinkedBlockingQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数所带的Comparator决定的顺序。
- * (4)SynchronousQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成的。
- *
- * 下面是用BlockingQueue来实现Producer和Consumer的例子
- */
- public class BlockingQueueTest {
- /** *//**
- * 定义装苹果的篮子
- */
- public static class Basket{
- // 篮子,能够容纳3个苹果
- BlockingQueue<String> basket = new ArrayBlockingQueue<String>(3);
- // 生产苹果,放入篮子
- public void produce() throws InterruptedException{
- // put方法放入一个苹果,若basket满了,等到basket有位置
- basket.put("An apple");
- }
- // 消费苹果,从篮子中取走
- public String consume() throws InterruptedException{
- // get方法取出一个苹果,若basket为空,等到basket有苹果为止
- return basket.take();
- }
- }
- // 测试方法
- public static void testBasket() {
- // 建立一个装苹果的篮子
- final Basket basket = new Basket();
- // 定义苹果生产者
- class Producer implements Runnable {
- public void run() {
- try {
- while (true) {
- // 生产苹果
- System.out.println("生产者准备生产苹果:"
- + System.currentTimeMillis());
- basket.produce();
- System.out.println("生产者生产苹果完毕:"
- + System.currentTimeMillis());
- // 休眠300ms
- Thread.sleep(300);
- }
- } catch (InterruptedException ex) {
- }
- }
- }
- // 定义苹果消费者
- class Consumer implements Runnable {
- public void run() {
- try {
- while (true) {
- // 消费苹果
- System.out.println("消费者准备消费苹果:"
- + System.currentTimeMillis());
- basket.consume();
- System.out.println("消费者消费苹果完毕:"
- + System.currentTimeMillis());
- // 休眠1000ms
- Thread.sleep(1000);
- }
- } catch (InterruptedException ex) {
- }
- }
- }
- ExecutorService service = Executors.newCachedThreadPool();
- Producer producer = new Producer();
- Consumer consumer = new Consumer();
- service.submit(producer);
- service.submit(consumer);
- // 程序运行5s后,所有任务停止
- try {
- Thread.sleep(5000);
- } catch (InterruptedException e) {
- }
- service.shutdownNow();
- }
- public static void main(String[] args) {
- BlockingQueueTest.testBasket();
- }
- }
发表评论
-
protobuf-dt插件
2015-03-24 13:16 1433protobuf-dt: 安装前先安装xtext 可 ... -
java循环标签
2015-03-20 16:13 622今天看 源码的时候 看到 一个小语法 参考: ... -
java程序性能优化 --阅读
2014-10-14 17:56 720闲着,真实无聊; 发现一本好书《java程序性能优 ... -
jetty invalid entry CRC问题
2014-08-04 11:42 16281: http://stackoverflow.com/qu ... -
基础题目
2014-07-24 13:49 651package com.ljq.base; / ... -
guice注入
2014-05-24 12:13 9460Google Guice3.0: http://code. ... -
eclipse快捷键
2014-05-21 16:01 5881: clrl+alt+r : 最常用,快速定位到文件 2 ... -
java clone
2014-05-16 17:04 535转:http://www.blogjava.net/ora ... -
ThreadLocal
2014-05-13 18:39 780简单介绍一下ThreadLocal的原理:1.Thread ... -
hession
2014-04-30 12:33 705一、首先先说Hessian是什么? Hessian:he ... -
冒泡和快速排序java
2014-04-19 18:01 7681: 冒泡最简单一种: /** * 算法效率o ... -
java生产者和消费者模型三种实现
2014-04-19 17:51 13771: 生产者和消费者的问题,生产者生产产品到缓冲区,消费者 ... -
单例模式
2014-03-14 16:06 754今天看到群里,关于单例模式的多线程下的安全问题: 1:最 ... -
freemarker的使用
2014-02-28 16:42 8521:freemarker eclipse插件安装方法:ht ... -
java 引用类型和内存泄露
2013-11-21 17:48 594http://blog.csdn.net/luoshenfu ... -
java泛型
2013-11-07 13:52 444Class<T>在实例化的时候,T要替换成具体 ... -
filter执行顺序
2013-10-12 11:16 1130多个筛选器的运行顺序取决于下列规则: 将 filt ... -
spring rmi远程调用
2013-09-09 11:48 11861:以前用jmi发布服务,实现分布式的一种方式,远程调用, ... -
spring mvc返回204状态码
2013-07-24 09:27 39371:204是没内容 不跳转的 代表请求成功的意思 ... -
editplus去掉多余空行
2013-07-19 21:05 7501: ^[ \t]*\n 用正则表达式替换
相关推荐
### 线程与BlockingQueue知识点详解 #### 1. BlockingQueue简介 `BlockingQueue`是一种特殊...通过上述实例,我们可以看到`BlockingQueue`如何有效地管理生产者与消费者之间的数据流,确保数据的一致性和线程安全性。
Java中的阻塞队列BlockingQueue是一种并发编程中常用的工具,它实现了线程间的同步和通信。阻塞队列的核心特性在于当队列为空时,尝试获取元素的线程会被阻塞,直到其他线程添加元素;当队列满时,尝试添加元素的...
1. 如何创建不同类型的BlockingQueue实例。 2. 生产者线程和消费者线程如何使用`put()`和`take()`方法交互。 3. 如何处理队列满或空的异常情况,例如使用`offer()`和`poll()`方法的超时版本。 4. 如何控制并发线程...
本文将深入探讨多线程的概念、工作原理、优缺点,并结合实例进行详细讲解。 首先,多线程是指在一个进程中可以同时运行多个线程。线程是操作系统分配CPU时间的基本单元,相比单线程,多线程能够更好地利用系统资源...
这个文件可能包含了如何创建`BlockingQueue`实例,以及如何在生产者和消费者线程之间正确使用它的代码片段。分析这个测试文件可以帮助我们更好地理解和应用`BlockingQueue`。实际操作中,我们可以通过监控和调优这些...
在Java编程中,`BlockingQueue`(阻塞队列)是一种重要的并发工具,它结合了队列的数据结构和线程同步机制。`BlockingQueue`接口位于`java.util.concurrent`包中,提供了线程安全的数据结构,可以用于实现生产者-...
示例代码展示了如何创建生产者和消费者线程,它们共享同一个 BlockingQueue 实例,通过 `put()` 和 `take()` 方法实现数据的传递。 在 ArrayBlockingQueue 和 LinkedBlockingQueue 的实现中,当队列满时,生产者...
Java的BlockingQueue接口(如ArrayBlockingQueue)非常适合实现这一模型,它提供了线程安全的数据插入和移除操作。 在实例中提到的"全部开始 全部停止 单个停止"可能涉及到线程的启动和控制,这可以通过控制线程的...
在Spring Boot中,我们可以通过配置bean来创建和管理BlockingQueue实例。通常,我们会选择实现BlockingQueue的类,如ArrayBlockingQueue、LinkedBlockingQueue或PriorityBlockingQueue,根据实际需求选择合适的实现...
本实例提供了源代码和详细指导教程,帮助开发者深入理解这一概念。 生产者消费者问题通常使用Java中的`java.util.concurrent`包来解决,特别是`BlockingQueue`接口。在这个例子中,`BlockingQueue`作为共享的缓冲区...
在TestBlockingQueueAndExecutorService这个测试用例中,作者可能演示了如何创建一个ExecutorService实例,然后将Runnable或Callable任务提交给它执行,同时使用BlockingQueue作为线程间的通信工具。通过这种方式,...
总的来说,`BlockingQueue`是Java并发编程中不可或缺的一部分,它提供了一种优雅的同步机制,使得生产者和消费者可以协同工作,避免了显式的锁和条件变量的使用,简化了多线程编程。在设计高性能、低延迟的系统时,`...
Java提供了BlockingQueue接口,实现了线程安全的队列,可以高效地在生产者和消费者之间传递数据。此外,还可以利用并发工具类如Semaphore(信号量)来控制对有限资源的访问,或者使用CountDownLatch来协调多个线程的...
本压缩包提供了两个基本的多线程开发实例,涵盖了通过继承`Thread`类和实现`Runnable`接口来创建线程的方法。这两种方法都是Java中实现并发的基本途径,各有优缺点。 首先,我们来看`ThreadDemo`。这个例子展示了...
在你的博客中,你可能详细讲解了如何在Spring MVC初始化阶段配置并使用`BlockingQueue`。这可能涉及到以下步骤: 1. 定义一个`BlockingQueue`的bean,例如使用`ArrayBlockingQueue`,并设置其容量以满足你的应用...
- **解决思路**: 使用 Java 的 `wait()` 和 `notify()` 方法,或者利用 `BlockingQueue` 类等来实现线程间的同步。 ### 四、序列化的编程实现 #### 1. 序列化概念 - **序列化**: 将对象的状态转换为可以存储或传输...
- **线程通信**:线程间可以通过`wait()`, `notify()`, `notifyAll()`进行同步,或者使用`BlockingQueue`等并发容器来交换数据。 - **线程优先级**:Java中的线程优先级从1(`Thread.MIN_PRIORITY`)到10(`Thread....
Java线程是多任务编程的重要概念,它允许程序同时执行多个独立的任务,从而...在"线程池.rar"和"线程实例"这两个文件中,你可以找到关于这些概念的具体示例代码,通过学习和实践,可以深入理解Java线程的运用和管理。
这个压缩包“Java 实例 - 查看线程优先级源代码+详细指导教程.zip”包含了一个关于如何查看和理解Java线程优先级的实例源代码和教学材料,对于深入学习Java多线程编程非常有帮助。 在Java中,线程的优先级是由`...
5. **线程通信**:线程间的通信可以通过wait(), notify()和notifyAll()方法,或者使用高级API如Semaphore、BlockingQueue等实现。 6. **线程池**:线程池可以有效地管理和控制线程,避免频繁创建和销毁线程带来的...