BlockingQueue

BlockingQueue 是新增的Concurrent包中的一种阻塞队列

特点

当BlockingQueue为空, 从队列取数据时会让线程等待状态,直到能取出非空的数据,线程会被唤醒。
当BlockingQueue是满的,存数据到队列时线程也会进入等待状态,直到有空间,线程才会被唤醒。

    A Queue that additionally supports operations that wait for the queue to become non-empty when retrieving an element, and wait for space to become available in the queue when storing an element.

作用

通过安全的BlockingQueue队列,能够很好的解决在多线程中,高效,安全的传输数据的问题,让我们能够快速的实现多线程操作,而不需关心一些线程安全的细节。

比如在典型的生产者消费者模式中,BlockingQueue 能够安全的应用在多个生产者,消费者线程中:

class Producer implements Runnable {private final BlockingQueue queue;Producer(BlockingQueue q) { queue = q; }public void run() {try {while (true) { queue.put(produce()); }} catch (InterruptedException ex) { ... handle ...}}Object produce() { ... }}class Consumer implements Runnable {private final BlockingQueue queue;Consumer(BlockingQueue q) { queue = q; }public void run() {try {while (true) { consume(queue.take()); }} catch (InterruptedException ex) { ... handle ...}}void consume(Object x) { ... }}class Setup {void main() {BlockingQueue q = new SomeQueueImplementation();Producer p = new Producer(q);Consumer c1 = new Consumer(q);Consumer c2 = new Consumer(q);new Thread(p).start();new Thread(c1).start();new Thread(c2).start();}}}

工作模式

在多线程环境下,BlockingQueue能够处理线程间安全问题。

在BlockingQueue队列为空的时候,消费者端的所有线程会自动处于等待(挂起)状态,直到有数据放入队列。

当BlockingQueue队列已满的时候,生产者端的线程都会被挂起,直到队列有空间,生产者线程会自动被唤醒。

所以在多线程环境下,BlockingQueue能够自动挂起和唤醒线程,不需要关心阻塞和唤醒的问题,所有的事情BlockingQueue已经帮我们处理了,我们只需要知道如何使用它。

方法介绍

BlockingQueue 的方法有以下四种形式:

1.trows exception

add

将非空元素加入队列中,如果能够容纳,返回true,否则trows exception

remove

移除队列头部元素,如果队列为空,trows exception

element

取出队列头部元素,如果队列为空,trows exception

2.返回值

offer

将非空元素加入队列中,如果BlockingQueue可以容纳,则返回true,否则返回false.

poll

移除队列头部元素,如果队列为空,返回null

peek

取出队列头部元素,如果队列为空,返回null

3.blocks

put

添加元素到队列,如果队列已满,线程进入等待,直到有空间

take

移除队列头部元素,如果队列为空,线程进入等待,直到有新的数据加入

4.Times Out

poll (long timeout, TimeUnit unit)

移除队列头部元素,在等待的时间内如果队列为空,返回null

offer (E e, long timeout, TimeUnit unit)

将非空元素加入队列中,在等待的时间内如果可以容纳,返回true,否则返回false

Android 之BlockingQueue相关推荐

  1. android中常见的内存泄漏和解决的方法

    android中的内存溢出预计大多数人在写代码的时候都出现过,事实上突然认为工作一年和工作三年的差别是什么呢.事实上干的工作或许都一样,产品汪看到的结果也都一样,那差别就是速度和质量了. 写在前面的一 ...

  2. android线程及线程池

    众所周知,在UI系统中进行一些耗时操作,都会导致卡顿现象,因为一次刷新在16ms,如果当次操作过了这个时间,那么用户就能感觉到明显的卡顿,甚至引起ANR . 对于这种情况,一般都是再起一个线程,进行一 ...

  3. Android开发——Android中常见的4种线程池(保证你能看懂并理解)

    0.前言 转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52415337 使用线程池可以给我们带来很多好处,首先通过线程池中线程的重用 ...

  4. Android多线程:这是一份全面 详细的线程池(ThreadPool)讲解教程

    前言 对于多线程,大家应该很熟悉.但是,大家了解线程池吗? 今天,我将带大家全部学习关于线程池的所有知识. 目录 1. 简介 2. 工作原理 2.1 核心参数 线程池中有6个核心参数,具体如下 上述6 ...

  5. android自定义线程池工具类,妈妈再也不用担心你不会使用线程池了(ThreadUtils)...

    为什么要用线程池 使用线程池管理线程有如下优点:降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行. 提高线程的可 ...

  6. Android 线程池概念及使用

    一:使用线程池的原因 在android开发中经常会使用多线程异步来处理相关任务,而如果用传统的newThread来创建一个子线程进行处理,会造成一些严重的问题: 在任务众多的情况下,系统要为每一个任务 ...

  7. Android之记录并研究Volley框架中知识点

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/50916258 本文出自:[顾林海的博客] ##前言 在上一遍<对 ...

  8. Android多线程之ArrayBlockingQueue源码解析

    阻塞队列系列 Android多线程之LinkedBlockingQueue源码解析 Android多线程之SynchronousQueue源码解析 Andorid多线程之DelayQueue源码分析 ...

  9. android universal image loader 缓冲原理详解

    1. 功能介绍 1.1 Android Universal Image Loader Android Universal Image Loader 是一个强大的.可高度定制的图片缓存,本文简称为UIL ...

最新文章

  1. oracle中生成大批量数据的方法-下
  2. 转一个,中文分词方法概述
  3. 第一次使用aspnet_compiler失败记录
  4. Oracle-多表连接的三种方式解读
  5. TIPS FOR LIVING AT CAMBRIDGE
  6. Stream流中的常用方法_map
  7. ASP.NET里创建Microsoft Word文档
  8. 07-图4 哈利·波特的考试 (25 分)
  9. Loadrunner乱码的解决办法
  10. 解决从PDF复制出来的文字总是换行的小技巧
  11. file Java 读取_Java读取文件方法汇总
  12. 【转载】福昕PDF电子文档处理套件 企业版 注册码 注册方法
  13. Excel·VBA单元格重复值标记颜色
  14. 红米4a android9.0,小米-红米4A/5A-通刷-LOS-Beta4.0-安卓9.0.0-来去电归属-农历等-本地化增强适配...
  15. 程序员走进偶像剧变身男主,网友:我服!
  16. 编译原理习题(含答案)——1 绪论——哈工大陈鄞配套版本
  17. 在x64上构建智能家居(home assistant) (三) 功能介绍 addons,hacs安装
  18. 如何科学化、系统化的构建行业舆情模型(关键词方案)
  19. oa办公自动化系统有什么作用?
  20. DFT分析连续非周期信号注意事项

热门文章

  1. 2017开发语言排行(本人是搞C#+javascript的)
  2. 使用OpenCV检测摄像头视频中的人脸
  3. 三维体素图绘制实验与教程
  4. html5调用papy支付,Payment
  5. C# 修改本地以太网ip地址
  6. Python之路(第二十三篇) 面向对象初级:静态属性、静态方法、类方法
  7. rk3288 ddr 开发指南
  8. 1.面试题目汇总-嵌入式篇
  9. 咖啡汪日志—— 回退兜底 及实用的服务降级策略
  10. 学完这个你就成为excel高手了!(Delphi对Excel的所有操作)逐个试试!