多线程学习(九)-可阻塞的队列
阻塞队列与Semaphore有些相似,但也不同,阻塞队列是一方存放数据,另一方释放数据,Semaphore通常则是由同一方设置和释放信号量。
ArrayBlockingQueue只有put方法和take方法才具有阻塞功能
在java.util.concurrent.Lock接口中实现了一个阻塞的缓冲区,在上面的一篇博客有介绍:阻塞队列的一个实现。
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;public class BlockingQueueTest {public static void main(String[] args) {final BlockingQueue 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,观察运行结果Thread.sleep(1000);System.out.println(Thread.currentThread().getName() + "准备取数据!");queue.take();System.out.println(Thread.currentThread().getName() + "已经取走数据," + "队列目前有" + queue.size() + "个数据"); } catch (InterruptedException e) {e.printStackTrace();}}}}.start(); }
}
2.应用:用阻塞队列实现线程同步通信
前面有博客介绍线程同步通信的实现就可以用阻塞队列实现。
线程同步通信实现的另外两种方式的例子
import java.util.Collections;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;public class BlockingQueueCommunication {/*** @param args*/public static void main(String[] args) {final Business business = new Business();new Thread(new Runnable() {@Overridepublic void run() {for(int i=1;i<=50;i++){business.sub(i);}}}).start();for(int i=1;i<=50;i++){business.main(i);}}static class Business {BlockingQueue<Integer> queue1 = new ArrayBlockingQueue<Integer>(1);BlockingQueue<Integer> queue2 = new ArrayBlockingQueue<Integer>(1);/*匿名构造函数*/{try {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<=10;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){try {queue2.put(1);} catch (InterruptedException e1) {e1.printStackTrace();}for(int j=1;j<=100;j++){System.out.println("main thread sequece of " + j + ",loop of " + i);}try {queue1.take();} catch (InterruptedException e) {e.printStackTrace();}}}}
多线程学习(九)-可阻塞的队列相关推荐
- Java多线程学习九:怎样确定线程数量及CPU 核心数和线程数的关系||如何定制自己的线程池
调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能.在实际工作中,我们需要根据任务类型的不同选择对应的策略. CPU 密集型任务 首先,我们 ...
- Java多线程学习九:如何正确关闭线程池?shutdown 和 shutdownNow 的区别
如何正确关闭线程池?以及 shutdown() 与 shutdownNow() 方法的区别?首先,我们创建一个线程数固定为 10 的线程池,并且往线程池中提交 100 个任务,如代码所示. 复制代码 ...
- 多线程学习九:煮茶算法
阅读华罗庚<统筹方法>,给出烧水泡茶的多线程解决方案,提示 参考图二,用两个线程(两个人协作)模拟烧水泡茶过程 文中办法乙.丙都相当于任务串行 而图一相当于启动了 4 个线程,有点浪费 用 ...
- Java多线程学习二十三:什么是阻塞队列
阻塞队列的作用 阻塞队列,也就是 BlockingQueue,它是一个接口,如代码所示: public interface BlockingQueue<E> extends Queue&l ...
- LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
目录 1114. 按序打印 解法 1115. 交替打印FooBar 解法 1116. 打印零与奇偶数 解法 1117. H2O 生成 解法 1118. 设计有限阻塞队列 解法 1195. 交替打印字符 ...
- Java多线程安全之阻塞式队列
在介绍阻塞队列之前我们先看下一下什么是生产者消费者模型: 生产者消费者模型就是通过一个容器来解决生产者和消费者的强耦合问题,生产者和消费者不直接进行通信,而是通过阻塞队列来进行通信,所以生产者生产完数 ...
- Java多线程学习 (超详细总结)
Java多线程学习 一.概要 二. JAVA 线程实现/创建方式 2.1 继承Thread 类 2.2 实现 Runnable 接口 2.3 Thread和Runnable的区别 2.4 总结 三.线 ...
- java多线程学习-java.util.concurrent详解
http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...
- Java多线程系列(九):CountDownLatch、Semaphore等4大并发工具类详解
之前谈过高并发编程系列:4种常用Java线程锁的特点,性能比较.使用场景 ,以及高并发编程系列:ConcurrentHashMap的实现原理(JDK1.7和JDK1.8) 今天主要介绍concurre ...
- 转:Java多线程学习(吐血超详细总结)
版权声明:本文为博主林炳文Evankaka原创文章,转载请注明出处http://blog.csdn.net/evankaka 目录(?)[+] 林炳文Evankaka原创作品.转载请注明出处http: ...
最新文章
- 制造业智能化的下一站——人与机器的协作
- 高性能ASP.NET站点构建之托管资源优化
- codeforces316E3
- Node基础: 回调函数 2
- 一些常用的图像数据库总结
- 开发常识 持续更新~~
- jQuery的过滤遍历
- VC++ (三)虚函数与重载
- kotlin转java_Kotlin热身篇: 简介与基本用法
- DatabaseMetaData 获取mysql表和字段注释
- RN Image与ImageBackground
- “Internet Explorer无法打开站点,已终止操作”解决
- Python+Opencv图像处理新手入门教程(三):阈值与二值化
- OpenCV 填充多边形 fillConvexPoly 和 fillPoly
- springboot redis token_Spring Boot + Redis 实现接口幂等性,看这篇就太好了!
- Python解法华为OJ机试-迷宫问题
- CS224W-图神经网络 笔记5.1:Spectral Clustering - 谱聚类基础知识点
- Ubuntu18.04配置YCM
- POJ,3713 Transferring Sylla
- 大数据开发教程——构建Hadoop开发环境
热门文章
- 第6章第27节:画面太空怎么办:使用小元素填充空旷的版面 [PowerPoint精美幻灯片实战教程]
- apk文件被安装到模拟器系统的/data/app文件下
- 【我的Android进阶之旅】解决使用DiskLruCache报错: keys must match regex [a-z0-9_-]{1,64}
- 使用prometheus(普罗米修斯)监控redis容器详解
- macos系统中shell脚本权限不足Permission denied的问题
- Modbus通讯协议学习文档
- iOS攻城狮修炼之路
- 秋招总结帖,还愿牛客
- python试卷管理系统的设计与实现_在线考试系统的设计与实现毕业设计论文.doc...
- python 爬漫画 小白学习过程