import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;/*** @ClassName Producer* @Description TODO(生产者)* @author wwj* @Date 2016年7月14日 下午4:22:57* @version 1.0.0.0*/
public class Producer implements Runnable {private volatile boolean      isRunning               = true;private BlockingQueue<String>  queue;private static AtomicInteger  count                   = new AtomicInteger();private static final int      DEFAULT_RANGE_FOR_SLEEP = 1000;public Producer(BlockingQueue<String> queue) {this.queue = queue;}public 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 + "放入队列...");//add(anObject):把anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则招聘异常//put(anObject):把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续.//offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回falseif (!queue.offer(data, 2L, TimeUnit.SECONDS)) {System.out.println("放入数据失败:" + data);}}} catch (InterruptedException e) {e.printStackTrace();Thread.currentThread().interrupt();} finally {System.out.println("退出生产者线程!");}}public void stop() {isRunning = false;}}

import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;/*** @ClassName Consumer* @Description TODO(消费者)* @author wwj* @Date 2016年7月14日 下午4:22:23* @version 1.0.0.0*/
public class Consumer implements Runnable {public Consumer(BlockingQueue<String> queue) {this.queue = queue;}public void run() {System.out.println("启动消费者线程!");Random r = new Random();boolean isRunning = true;try {while (isRunning) {System.out.println("正从队列获取数据...");//take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到Blocking有新的对象被加入为止                 //如果用take -->   if (queue.size() > 0) {}//poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回nullString 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("退出消费者线程!");}}private BlockingQueue<String> queue;private static final int      DEFAULT_RANGE_FOR_SLEEP = 1000;
}

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;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);// 退出Executor
        service.shutdown();}
}

阻塞队列BlockingQueue 学习相关推荐

  1. 阻塞队列BlockingQueue源码

    JAVA阻塞队列 在学习线程池框架ThreadPoolExecutor时发现线程池的实现依赖到了阻塞队列BlockingQueue,在队列为空时take方法会阻塞当前线程,因此这里以ThreadPoo ...

  2. Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例

    Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java.util.concurr ...

  3. java阻塞队列作用_简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用...

    简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用 Condition:可以理解成一把锁的一个钥匙,它既可以解锁(通知放行),又可以加锁(阻塞) n ...

  4. 并发编程-concurrent指南-阻塞队列BlockingQueue

    阻塞队列BlockingQueue,java.util.concurrent下的BlockingQueue接口表示一个线程放入和提取实例的队列. 适用场景: BlockingQueue通常用于一个线程 ...

  5. 抽象同步器AQS应用之--阻塞队列BlockingQueue,如何保证任务一定被消费?

    文章目录 1.阻塞队列简介 2. BlockingQueue源码分析 3. 生产者消费者模型如何保证信息不会丢失? 1.阻塞队列简介 1.1 什么是阻塞队列? 阻塞队列是一个队列 ①:当队列是空的,从 ...

  6. java 阻塞队列 BQ_阻塞队列 BlockingQueue的使用(二)

    原 阻塞队列 BlockingQueue的使用(二) BlockingQueue 的核心方法:方法类型抛出异常特殊值阻塞超时 插入add(e)offer(e)put(e)offer(e,time,un ...

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

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

  8. 并发编程-23J.U.C组件拓展之阻塞队列BlockingQueue 和 线程池

    文章目录 概述 阻塞队列的常用场景 阻塞队列的4种处理方式 JDK 7提供的7个阻塞队列 ArrayBlockingQueue LinkedBlockingQueue PriorityBlocking ...

  9. 阻塞队列BlockingQueue

    BlockingQueue最终会有四种状况,抛出异常.返回特殊值.阻塞.超时,下表总结了这些方法: 抛出异常 特殊值 阻塞 超时 插入 add(e) offer(e) put(e) offer(e, ...

最新文章

  1. 【UAV】从单个螺旋桨到四旋翼无人机运动学分析
  2. (部分来自windows核心编程)远程注入dll
  3. flyme8会更新Android版本吗,魅族17系列升级Flyme 8.1操作系统:终于到Android 10
  4. 妙味css3课程---1-1、css中自定义属性可以用属性选择器么
  5. LeetCode题 - 1 两数之和
  6. linux 内核配置v4l2,深入理解linux内核v4l2框架之videobuf2【转】
  7. 【证明】—— 斐波那契
  8. VC++运行时静默安装
  9. FreeRTOS 配置文件
  10. 从生活中领悟设计模式(Python)
  11. 如何从ST官方获取你需要的单片机原理图和PCB封装
  12. RGB-D SLAM in Dynamic Environments Using Static Point Weighting论文笔记
  13. 如何通过编程打开一个网页
  14. spring security——学习笔记(day05)-实现自定义 AuthenticationProvider身份认证-手机号码认证登录
  15. 如何评估开发代码质量
  16. python logging动态变更输出日志文件名
  17. 软考是什么?为什么要考?
  18. 2018年下半年系统集成项目管理工程师下午案例分析真题
  19. 黑客教父详解账号泄露全过程
  20. 北大 计算机 考研 专业课程,2020北京大学软微计算机考研初试科目、参考书目、复试线汇总...

热门文章

  1. 用tarball实现liferay自动安装部署15-复制定制后的catalina.sh
  2. 给力的 Google HTML5 训练营(HTML5 DragDrop 拖拽、FileRea...
  3. IT职业应该注意的几个问题
  4. java B2B2C 源码 多级分销springmvc mybatis多租户电子商城系统--配置中心服务化和高可用...
  5. Python链接Mssql之Python库pymssql
  6. 华胜天成1.18亿美元收购美国GD公司
  7. 键桥通讯4000万投资创投布局大数据
  8. 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一第1章 C语言与内存1.1 引言...
  9. 2017上半年软考 第七章 重要知识点
  10. Spring MVC + Mybatis项目搭建