阻塞队列BlockingQueue 学习
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 学习相关推荐
- 阻塞队列BlockingQueue源码
JAVA阻塞队列 在学习线程池框架ThreadPoolExecutor时发现线程池的实现依赖到了阻塞队列BlockingQueue,在队列为空时take方法会阻塞当前线程,因此这里以ThreadPoo ...
- Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例
Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java.util.concurr ...
- java阻塞队列作用_简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用...
简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用 Condition:可以理解成一把锁的一个钥匙,它既可以解锁(通知放行),又可以加锁(阻塞) n ...
- 并发编程-concurrent指南-阻塞队列BlockingQueue
阻塞队列BlockingQueue,java.util.concurrent下的BlockingQueue接口表示一个线程放入和提取实例的队列. 适用场景: BlockingQueue通常用于一个线程 ...
- 抽象同步器AQS应用之--阻塞队列BlockingQueue,如何保证任务一定被消费?
文章目录 1.阻塞队列简介 2. BlockingQueue源码分析 3. 生产者消费者模型如何保证信息不会丢失? 1.阻塞队列简介 1.1 什么是阻塞队列? 阻塞队列是一个队列 ①:当队列是空的,从 ...
- java 阻塞队列 BQ_阻塞队列 BlockingQueue的使用(二)
原 阻塞队列 BlockingQueue的使用(二) BlockingQueue 的核心方法:方法类型抛出异常特殊值阻塞超时 插入add(e)offer(e)put(e)offer(e,time,un ...
- java多线程-阻塞队列BlockingQueue
大纲 BlockingQueue接口 ArrayBlockingQueue 一.BlockingQueue接口 public interface BlockingQueue<E> exte ...
- 并发编程-23J.U.C组件拓展之阻塞队列BlockingQueue 和 线程池
文章目录 概述 阻塞队列的常用场景 阻塞队列的4种处理方式 JDK 7提供的7个阻塞队列 ArrayBlockingQueue LinkedBlockingQueue PriorityBlocking ...
- 阻塞队列BlockingQueue
BlockingQueue最终会有四种状况,抛出异常.返回特殊值.阻塞.超时,下表总结了这些方法: 抛出异常 特殊值 阻塞 超时 插入 add(e) offer(e) put(e) offer(e, ...
最新文章
- 【UAV】从单个螺旋桨到四旋翼无人机运动学分析
- (部分来自windows核心编程)远程注入dll
- flyme8会更新Android版本吗,魅族17系列升级Flyme 8.1操作系统:终于到Android 10
- 妙味css3课程---1-1、css中自定义属性可以用属性选择器么
- LeetCode题 - 1 两数之和
- linux 内核配置v4l2,深入理解linux内核v4l2框架之videobuf2【转】
- 【证明】—— 斐波那契
- VC++运行时静默安装
- FreeRTOS 配置文件
- 从生活中领悟设计模式(Python)
- 如何从ST官方获取你需要的单片机原理图和PCB封装
- RGB-D SLAM in Dynamic Environments Using Static Point Weighting论文笔记
- 如何通过编程打开一个网页
- spring security——学习笔记(day05)-实现自定义 AuthenticationProvider身份认证-手机号码认证登录
- 如何评估开发代码质量
- python logging动态变更输出日志文件名
- 软考是什么?为什么要考?
- 2018年下半年系统集成项目管理工程师下午案例分析真题
- 黑客教父详解账号泄露全过程
- 北大 计算机 考研 专业课程,2020北京大学软微计算机考研初试科目、参考书目、复试线汇总...
热门文章
- 用tarball实现liferay自动安装部署15-复制定制后的catalina.sh
- 给力的 Google HTML5 训练营(HTML5 DragDrop 拖拽、FileRea...
- IT职业应该注意的几个问题
- java B2B2C 源码 多级分销springmvc mybatis多租户电子商城系统--配置中心服务化和高可用...
- Python链接Mssql之Python库pymssql
- 华胜天成1.18亿美元收购美国GD公司
- 键桥通讯4000万投资创投布局大数据
- 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一第1章 C语言与内存1.1 引言...
- 2017上半年软考 第七章 重要知识点
- Spring MVC + Mybatis项目搭建