ArrayBlockingQueue(jdk中已经提供 就在那个condition类说明里的可阻塞示例程序的下面就说明了)
注意三个添加方法的区别->查API文档 拿插入来说 一个会抛异常 一个返回true/false 一个会阻塞
是记不住的 找到doc即可 把精力留出来吧
阻塞队列与Semaphore有些相似,但也不同,阻塞队列是一方存放数据,另一方释放数据,Semaphore通常则是由同一方设置和释放信号量。

用3个空间的队列来演示阻塞队列的功能和效果。

package javaplay.thread.test;import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;public class BlockingQueueTest {public static void main(String[] args) {final BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(3);for (int i = 0; i < 2; i++) {new Thread() {public void run() {while (true) {try {Thread.sleep((long) (Math.random() * 1000));System.out.println(Thread.currentThread().getName() + "准备放数据!");queue.put(1);System.out.println(Thread.currentThread().getName() + "已经放了数据," + "队列目前有" + queue.size() + "个数据");} catch (InterruptedException e) {e.printStackTrace();}}}}.start();}new Thread() {public void run() {while (true) {try {// 将此处的睡眠时间分别改为100和1000,观察运行结果会发现经常会有3个数据 100则因取得快很少有3Thread.sleep(1000);System.out.println(Thread.currentThread().getName() + "准备取数据!");queue.take();System.out.println(Thread.currentThread().getName() + "已经取走数据," + "队列目前有" + queue.size() + "个数据");} catch (InterruptedException e) {e.printStackTrace();}}}}.start();}
}

用两个具有1个空间的队列来实现同步通知的功能。

package javaplay.thread.test;import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;public class BlockingQueueCommunication {public static void main(String[] args) {final Business business = new Business();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i <= 5; i++) {business.sub(i);}}}).start();for (int i = 1; i <= 5; i++) {business.main(i);}}static class Business {BlockingQueue<Integer> queue1 = new ArrayBlockingQueue<Integer>(1);BlockingQueue<Integer> queue2 = new ArrayBlockingQueue<Integer>(1);{// 此处不能加static(queue1/queue2都不是static) 这叫匿名构造方法 运行时机在任何构造方法之前// Collections.synchronizedMap(null);try {System.out.println("xxxxxdfsdsafdsa");queue2.put(1);} catch (InterruptedException e) {e.printStackTrace();}}public void sub(int i) {try {queue1.put(1);} catch (InterruptedException e) {e.printStackTrace();}for (int j = 1; j <= 1; j++) {System.out.println("sub thread sequece of " + j + ",loop of " + i);}try {queue2.take();} catch (InterruptedException e) {e.printStackTrace();}}public void main(int i) {// 此处不能加synchronized 否则如果main先进去就死锁了try {queue2.put(1);} catch (InterruptedException e1) {e1.printStackTrace();}for (int j = 1; j <= 2; j++) {System.out.println("main thread sequece of " + j + ",loop of " + i);}try {queue1.take();} catch (InterruptedException e) {e.printStackTrace();}}}}

一个队列可否实现呢?

转载于:https://www.cnblogs.com/john8169/p/9780546.html

Java多线程之线程并发库阻塞队列的应用相关推荐

  1. Java多线程与线程并发库高级应用笔记

    以下内容是学习张老师Java多线程与线程并发库高级应用时所做的笔记,很有用 网络编辑器直接复制Word文档排版有点乱,提供原始文件下载 先看源文件概貌 张孝祥_Java多线程与并发库高级应用 [视频介 ...

  2. Java多线程(五) —— 线程并发库之锁机制

    参考文献: http://www.blogjava.net/xylz/archive/2010/07/08/325587.html 一.Lock与ReentrantLock 前面的章节主要谈谈原子操作 ...

  3. Java多线程之线程并发库原子性操作类

    AtomicInteger 用得不当被笑掉大牙 AtomicIntegerArray AtomicIntegerFieldUpdater:对类中整数字段进行操作,需要先反射获取对象身上的字段 即ato ...

  4. java基础巩固笔记(5)-多线程之线程并发库

    2019独角兽企业重金招聘Python工程师标准>>> java基础巩固笔记(5)-多线程之线程并发库 标签: java [TOC] 本文主要概述java.util.concurre ...

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

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

  6. Java多线程之线程通信之生产者消费者阻塞队列版

    Java多线程之线程通信之生产者消费者传统版和阻塞队列版 目录 线程通信之生产者消费者传统版 线程通信之生产者消费者阻塞队列版 1. 线程通信之生产者消费者传统版 题目: 一个初始值为零的变量,两个线 ...

  7. 让人抓头的Java并发(四) 阻塞队列--CPU飙升排查案例

    在上一篇文章中给大家介绍了牛批的AQS,大致讲解了JUC中同步的思路.本来还没想好这一篇应该写点什么,刚好上周某个同事的代码出现问题,排查后发现是使用阻塞队列不当导致的,所以本篇决定介绍下阻塞队列. ...

  8. java并发队列_Java并发教程–阻塞队列

    java并发队列 如第3部分所述,Java 1.5中引入的线程池提供了核心支持,该支持很快成为许多Java开发人员的最爱. 在内部,这些实现巧妙地利用了Java 1.5中引入的另一种并发功能-阻塞队列 ...

  9. Java并发教程–阻塞队列

    如第3部分所述,Java 1.5中引入的线程池提供了核心支持,该支持很快成为许多Java开发人员的最爱. 在内部,这些实现巧妙地利用了Java 1.5中引入的另一种并发功能-阻塞队列. 队列 首先,简 ...

最新文章

  1. 网络编程学习笔记(udp_connect函数)
  2. ECSHOP在打印订单时打印出商品序号
  3. 简历中该怎么写自己了解html,我用HTML写简历
  4. 表单PostGet两个长度限制问题的分析
  5. 性能强悍的MCU,主频干到GHz
  6. jdbc连接mysql的配置文件_如何实现jdbc连接数据库并通过配置文件调用数据的方法(代码)...
  7. 一次线上Nginx出问题排错经历
  8. InnoDB与UUID
  9. GET 和 POST请求的本质区别是什么?看完觉得自己太无知了...
  10. (超详细)算法学习:STL和基本数据结构
  11. go 学习笔记之咬文嚼字带你弄清楚 defer 延迟函数
  12. html+css+js制作点名器
  13. Liunx查看系统版本
  14. 阿里系-淘宝接口抓取
  15. Java代理模式:(二)代理模式
  16. R包SPOTlight安装(新手向)
  17. addRoute动态添加路由导致浏览器警告
  18. leo_流动人口信息管理系统
  19. javascript小技巧!
  20. 随想录二刷Day15——二叉树

热门文章

  1. Eclipse安装插件时报No repository found containing...解决办法
  2. html交互式添加线要素,HTML5 Canvas绘制交互式交叉线
  3. h3c服务器安装linux,H3C服务器安装Ubuntu操作系统
  4. java rmi 还有用吗_java rmi使用后的感想
  5. python扫雷代码_谁说Python不能做游戏的?能做这些游戏,附赠所有游戏源码文件...
  6. 服了,为什么100M宽带还这么卡?
  7. 【无标题】12.04 Serverless Meetup 深圳站 | Call 你来参加
  8. Service Mesh 从“趋势”走向“无聊”
  9. SpringCloud 应用在 Kubernetes 上的最佳实践 — 诊断(线上联调)
  10. ant接口自动化 junit_Jenkins + Ant自动运行Junit测试