Java多线程之线程并发库阻塞队列的应用
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多线程之线程并发库阻塞队列的应用相关推荐
- Java多线程与线程并发库高级应用笔记
以下内容是学习张老师Java多线程与线程并发库高级应用时所做的笔记,很有用 网络编辑器直接复制Word文档排版有点乱,提供原始文件下载 先看源文件概貌 张孝祥_Java多线程与并发库高级应用 [视频介 ...
- Java多线程(五) —— 线程并发库之锁机制
参考文献: http://www.blogjava.net/xylz/archive/2010/07/08/325587.html 一.Lock与ReentrantLock 前面的章节主要谈谈原子操作 ...
- Java多线程之线程并发库原子性操作类
AtomicInteger 用得不当被笑掉大牙 AtomicIntegerArray AtomicIntegerFieldUpdater:对类中整数字段进行操作,需要先反射获取对象身上的字段 即ato ...
- java基础巩固笔记(5)-多线程之线程并发库
2019独角兽企业重金招聘Python工程师标准>>> java基础巩固笔记(5)-多线程之线程并发库 标签: java [TOC] 本文主要概述java.util.concurre ...
- Java多线程_JUC包下的阻塞队列
在前面我们提到了阻塞队列,也用过了LinkedBolckingQueue队列了,在这里,我们主要对 ArrayBlockingQueue,PriorityBlockingQueue,DelayQueu ...
- Java多线程之线程通信之生产者消费者阻塞队列版
Java多线程之线程通信之生产者消费者传统版和阻塞队列版 目录 线程通信之生产者消费者传统版 线程通信之生产者消费者阻塞队列版 1. 线程通信之生产者消费者传统版 题目: 一个初始值为零的变量,两个线 ...
- 让人抓头的Java并发(四) 阻塞队列--CPU飙升排查案例
在上一篇文章中给大家介绍了牛批的AQS,大致讲解了JUC中同步的思路.本来还没想好这一篇应该写点什么,刚好上周某个同事的代码出现问题,排查后发现是使用阻塞队列不当导致的,所以本篇决定介绍下阻塞队列. ...
- java并发队列_Java并发教程–阻塞队列
java并发队列 如第3部分所述,Java 1.5中引入的线程池提供了核心支持,该支持很快成为许多Java开发人员的最爱. 在内部,这些实现巧妙地利用了Java 1.5中引入的另一种并发功能-阻塞队列 ...
- Java并发教程–阻塞队列
如第3部分所述,Java 1.5中引入的线程池提供了核心支持,该支持很快成为许多Java开发人员的最爱. 在内部,这些实现巧妙地利用了Java 1.5中引入的另一种并发功能-阻塞队列. 队列 首先,简 ...
最新文章
- 网络编程学习笔记(udp_connect函数)
- ECSHOP在打印订单时打印出商品序号
- 简历中该怎么写自己了解html,我用HTML写简历
- 表单PostGet两个长度限制问题的分析
- 性能强悍的MCU,主频干到GHz
- jdbc连接mysql的配置文件_如何实现jdbc连接数据库并通过配置文件调用数据的方法(代码)...
- 一次线上Nginx出问题排错经历
- InnoDB与UUID
- GET 和 POST请求的本质区别是什么?看完觉得自己太无知了...
- (超详细)算法学习:STL和基本数据结构
- go 学习笔记之咬文嚼字带你弄清楚 defer 延迟函数
- html+css+js制作点名器
- Liunx查看系统版本
- 阿里系-淘宝接口抓取
- Java代理模式:(二)代理模式
- R包SPOTlight安装(新手向)
- addRoute动态添加路由导致浏览器警告
- leo_流动人口信息管理系统
- javascript小技巧!
- 随想录二刷Day15——二叉树
热门文章
- Eclipse安装插件时报No repository found containing...解决办法
- html交互式添加线要素,HTML5 Canvas绘制交互式交叉线
- h3c服务器安装linux,H3C服务器安装Ubuntu操作系统
- java rmi 还有用吗_java rmi使用后的感想
- python扫雷代码_谁说Python不能做游戏的?能做这些游戏,附赠所有游戏源码文件...
- 服了,为什么100M宽带还这么卡?
- 【无标题】12.04 Serverless Meetup 深圳站 | Call 你来参加
- Service Mesh 从“趋势”走向“无聊”
- SpringCloud 应用在 Kubernetes 上的最佳实践 — 诊断(线上联调)
- ant接口自动化 junit_Jenkins + Ant自动运行Junit测试