2019独角兽企业重金招聘Python工程师标准>>>

在hadoop底层代码中,会看到有BlockingQueue的使用。

作为了解配置调优的作用,我也来了解一下BlockingQueue的使用。

BlockingQueue的核心方法:
放入数据:
  offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,
    则返回true,否则返回false.(本方法不阻塞当前执行方法的线程)
  offer(E o, long timeout, TimeUnit unit),可以设定等待的时间,如果在指定的时间内,还不能往队列中
    加入BlockingQueue,则返回失败。
  put(anObject):把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断
    直到BlockingQueue里面有空间再继续.
获取数据:
  poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,
    取不到时返回null;
  poll(long timeout, TimeUnit unit):从BlockingQueue取出一个队首的对象,如果在指定时间内,
    队列一旦有数据可取,则立即返回队列中的数据。否则知道时间超时还没有数据可取,返回失败。
  take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到
    BlockingQueue有新的数据被加入; 
  drainTo():一次性从BlockingQueue获取所有可用的数据对象(还可以指定获取数据的个数), 
    通过该方法,可以提升获取数据效率;不需要多次分批加锁或释放锁。

package com.test.concurrent;import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;public class Producer implements Runnable {private volatile boolean isRunning = true;private BlockingQueue queue;private static AtomicInteger count = new AtomicInteger();private static final int DEFAULT_RANGE_FOR_SLEEP = 1000;public Producer(BlockingQueue queue) {this.queue = queue;}@Overridepublic void run() {String data = null;Random r = new Random();System.out.println("启动生产者线程!");try {while (isRunning) {System.out.println("正在生产数据...");Thread.sleep(r.nextInt(DEFAULT_RANGE_FOR_SLEEP));data = "data:" + count.incrementAndGet();System.out.println("将数据:" + data + "放入队列...");if (!queue.offer(data, 2, TimeUnit.SECONDS)) {System.out.println("放入数据失败:" + data);}}}catch (InterruptedException e) {e.printStackTrace();Thread.currentThread().interrupt();} finally {System.out.println("退出生产者线程!");}}public void stop() {isRunning = false;}
}
package com.test.concurrent;import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;public class Consumer implements Runnable{private BlockingQueue<String> queue;private static final int DEFAULT_RANGE_FOR_SLEEP = 1000;public Consumer(BlockingQueue<String> queue) {this.queue = queue;}@Overridepublic void run() {System.out.println("启动消费者线程!");Random r = new Random();boolean isRunning = true;try {while (isRunning) {System.out.println("正从队列获取数据...");String data = queue.poll(2, TimeUnit.SECONDS);if (null != data) {System.out.println("拿到数据:" + data);System.out.println("正在消费数据:" + data);Thread.sleep(r.nextInt(DEFAULT_RANGE_FOR_SLEEP));} else {// 超过2s还没数据,认为所有生产线程都已经退出,自动退出消费线程。isRunning = false;}}}catch (InterruptedException e) {e.printStackTrace();Thread.currentThread().interrupt();} finally {System.out.println("退出消费者线程!");}}
}
package com.test.concurrent;import java.util.concurrent.*;
import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;public class BlockingQueueTest {public static void main(String[] args) throws InterruptedException {// 声明一个容量为10的缓存队列BlockingQueue<String> queue = new LinkedBlockingQueue<String>(10);Producer producer1 = new Producer(queue);Producer producer2 = new Producer(queue);Producer producer3 = new Producer(queue);Consumer consumer = new Consumer(queue);// 借助ExecutorsExecutorService service = Executors.newCachedThreadPool();// 启动线程service.execute(producer1);service.execute(producer2);service.execute(producer3);service.execute(consumer);// 执行10sThread.sleep(10 * 1000);producer1.stop();producer2.stop();producer3.stop();Thread.sleep(2000);// 退出Executorservice.shutdown();}
}

转载于:https://my.oschina.net/dacoolbaby/blog/352941

Java多线程包之BlockingQueue相关推荐

  1. java blockqueue_[Java基础] Java多线程-工具篇-BlockingQueue

    前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全"传输"数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多 ...

  2. java多线程-阻塞队列BlockingQueue

    大纲 BlockingQueue接口 ArrayBlockingQueue 一.BlockingQueue接口 public interface BlockingQueue<E> exte ...

  3. Java多线程(五)之BlockingQueue深入分析

    一.概述: BlockingQueue作为线程容器,可以为线程同步提供有力的保障. 二.BlockingQueue定义的常用方法 1.BlockingQueue定义的常用方法如下:   抛出异常 特殊 ...

  4. java核心-多线程-Java多线程编程涉及到包、类

    Java有关多线程编程设计的类主要涉及两个包java.lang和java.util.concurrent两个包 java.lang包,主要是线程基础类 <1>Thread<2> ...

  5. Java多线程_JUC包下的阻塞队列

    在前面我们提到了阻塞队列,也用过了LinkedBolckingQueue队列了,在这里,我们主要对 ArrayBlockingQueue,PriorityBlockingQueue,DelayQueu ...

  6. 40个Java多线程问题总结

    (转) 这篇文章作者写的真是不错 40个问题汇总 1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓"知其然知其所 ...

  7. JAVA多线程和并发基础面试问答

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在 ...

  8. 史上最全 Java 多线程面试题及答案

    这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题. 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有些问题对应的答案也有.也可能有些各位网友也 ...

  9. ***JAVA多线程和并发基础面试问答

    多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题.(校对注:非常赞同这个观 ...

最新文章

  1. boost::mp11::mp_partition相关用法的测试程序
  2. Eclipse——热键amp;Help
  3. 中科大基础数学博士招生放大招 年收入10万吸引生源
  4. Docker创建自己的镜像库
  5. XMLHTTPRequest的属性和方法简介
  6. 使用 jQuery Mobile 与 HTML5 开发 Web App (八) —— jQuery Mobile 工具栏
  7. xcode 常用快捷键
  8. oracle关闭数据库容器,Oracle12cr1新特性之容器数据库(CDB)和可插拔数据库(PDB) 的启动和关闭...
  9. [论文阅读] Exploring Dense Context for Salient Object Detection
  10. vue_music:搜索search.vue
  11. jq 改数组的k值_在JSON jq中修改键值数组
  12. oracle 8i漏洞渗透,IT新聞-Oracle 8i及多米諾服務器有安全漏洞
  13. 在线工具大全,程序员必备
  14. zlog的安装与使用
  15. fastai 2019 lesson9 notes 笔记
  16. html5小游戏跑,HTML5 Speedster 小游戏(高速跑跳过关)
  17. MySQL数据库(四)底层NB-IoT数据流的数据库写入
  18. 跟着老猫来搞GO——启程
  19. 【程序源代码】见缝插针游戏
  20. 中国手机芯片市场份额将变

热门文章

  1. Python+Selenium FAQ
  2. 换个思路理解Javascript中的this
  3. SpriteBuilder切换解决方案以及CCB的修改与保存
  4. 系统工程师加薪必备技能-活动目录 (Active Directory)
  5. NAB展会新闻:微软和媒体娱乐合作伙伴在Windows Azure平台上发展数字供应链解决方案...
  6. Java开发设计——UML类图
  7. 台大李宏毅Machine Learning 2017Fall学习笔记 (1)Introduction of machine Learning
  8. 森林结点数,边数与树个数的关系
  9. VScode 把tab置换为空格
  10. tf.GraphKeys,tf.add_to_collection() 与 tf.get_collection()