使用BlockingQueue来实现产生都与消费者的例子,比起前面第三章的用法会更加简单,因为它不需要去解决同步问题。下面的例子使用BlockingQueue和ArrayBlockingQueue实现生产者的消费者的例子。

package com.owen.thread.chapter8;import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class PC
{public static void main(String[] args){final BlockingQueue<Character> bq;bq = new ArrayBlockingQueue<Character>(26);final ExecutorService executor = Executors.newFixedThreadPool(2);Runnable producer = () -> {for (char ch = 'A'; ch <= 'Z'; ch++){try{bq.put(ch);System.out.printf("%c produced by " + "producer.%n", ch);} catch (InterruptedException ie){}}};executor.execute(producer);Runnable consumer = () -> {char ch = '\0';do{try{ch = bq.take();System.out.printf("%c consumed by " + "consumer.%n", ch);} catch (InterruptedException ie){}} while (ch != 'Z');executor.shutdownNow();};executor.execute(consumer);}
}

上面的例子中,使用BlockingQueue()的put()和take()方法,分别代表,在阻塞的队列中放入一个对象,和在阻塞的队列中移除一个对象。当没有空间放入一个对象时,put()方法会阻塞;当队列为空时,take()会阻塞。

BlockingQueue确保一个字母在生产之前不会被消费,这个应用会有输出提示。例子,执行这个程序会得到如下的输出:

A produced by producer.
B produced by producer.
A consumed by consumer.
B consumed by consumer.
C consumed by consumer.
C produced by producer.
••••••

8.1.1使用BlockingQueue和ArrayBlockingQueue相关推荐

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

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

  2. 从一个故障说说Java的三个BlockingQueue

    最近出了个故障,排查的时候耗费了很长的时间,回顾整个排查过程,经验主义在这里起了不好的作用,直接导致了整个故障排查的时间非常长,这个故障的根本原因在于BlockingQueue用的有问题,顺带展开说说 ...

  3. 多线程:线程池里的队列BlockingQueue

    runnableTaskQueue(任务队列):用于保存等待执行的任务的阻塞队列. 可以选择以下几个阻塞队列: BlockingQueue的几个注意点 [1]BlockingQueue 可以是限定容量 ...

  4. BlockingQueue常用方法add、off、put、take、poll使用说明

    1.BlockingQueue的定义 首先将BlockingQueue提供的方法的含义解释如下: import java.util.Collection; import java.util.Queue ...

  5. 【学习笔记】抽象队列同步器AQS应用之BlockingQueue详解

    文章目录 什么是AQS框架 Aqs核心源码 基于aqs实现的锁 BlockingQueue ArrayBlockingQueue LinkedBlockingQueue DelayQueue Bloc ...

  6. 19.并发容器之BlockingQueue

    1. BlockingQueue简介 在实际编程中,会经常使用到JDK中Collection集合框架中的各种容器类如实现List,Map,Queue接口的容器类,但是这些容器类基本上不是线程安全的,除 ...

  7. JUC阻塞队列BlockingQueue讲解

    概述 阻塞队列有两个特性: 阻塞:当队列为空时,会阻塞队列弹出操作,直到队列不为空.当队列满了时,会阻塞入队操作,直到队列不满. 队列:FIFO,先进先出. 接口:java.util.concurre ...

  8. Java并发编程-BlockingQueue阻塞队列

    BlockingQueue阻塞队列 1.BlockingQueue介绍 1.1.引言: 1.2.阻塞队列介绍: 1.3.阻塞队列的用处: 1.4.接口架构图 2.BlockingQueue核心方法 3 ...

  9. Java并发编程:4种线程池和缓冲队列BlockingQueue

    一. 线程池简介 1. 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池.使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动 ...

  10. Java高并发BlockingQueue重要的实现类

    ArrayBlockingQueue 有界的阻塞队列,内部是一个数组,有边界的意思是:容量是有限的,必须进行初始化,指定它的容量大小,以先进先出的方式存储数据,最新插入的在对尾,最先移除的对象在头部. ...

最新文章

  1. springboot 配置DRUID数据源
  2. php对象+this,PHP $this:当前对象
  3. js邮箱正则表达式的使用
  4. mint mvc简介
  5. Excel XP受损文件的急救三招
  6. 扑克牌图片一张一张_培养孩子的数学力,不妨试试这五个扑克牌游戏
  7. 算法只能应用于计算机吗,把你的原则转换成算法,让计算机和你一起决策
  8. java组合语法_JAVA复用类之组合语法的使用(附源码)
  9. Js中动态追加代码后,之前定义的Js不再起作用
  10. JavaSE----常用类(String、StringBuilder、StringBuffer)
  11. 【译】WebSocket协议第四章——连接握手(Opening Handshake)
  12. 208-实现 Trie (前缀树)
  13. 微信公众号内推送模板消息
  14. Python中base64编码解码结果为b‘xxx‘
  15. java邮件发送 qq与163邮箱互发和qq和163邮箱发送其他邮箱实例
  16. csdn 问答使用与测评
  17. SpringCloud这35问,弄懂了面试官都不得不夸你一句
  18. 报表中小计汇总总计在代码实现
  19. iOS逆向 - iOS13 iOS14 模拟点击 模拟触摸 按键模拟 新触动精灵 开源免费
  20. 2018-2019-2 网络对抗技 20165328 Exp7: 网络欺诈防范

热门文章

  1. Douglas Peucker算法的C#实现
  2. 你真的会使用SQL Server的备份还原功能吗?之一:恢复模型
  3. windows phone (24) Canvas元素A
  4. 使用Lazy对构造进行重构后比较
  5. webservice系列1---基于web工程上写一个基本数据类型的webservice
  6. html 自动关机程序,Windows 自动关机/定时关机 命令 shuntdown
  7. 十八、K8s升级集群
  8. “OSPF” DR与BDR
  9. ELK详解(二十三)——elastalert告警优化
  10. QoS队列调度技术详解