java 5并发中的阻塞队列ArrayBlockingQueue的使用以及案例实现
演示一个阻塞队列的使用
public class BlockingQueueTest
{
public static void main(String[] args)
{
//创建一个包含三个元素的阻塞队列
final BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(3);
for (int i = 0; i < 2; i++)
{
new Thread(new Runnable()
{
@Override
public void run()
{
while(true){
try
{
Thread.sleep(1000);
System.out.println("线程"+Thread.currentThread().getName()+" 准备放数据了");
queue.put(new Random().nextInt(100));
System.out.println("线程"+Thread.currentThread().getName()+" 已经放完数据了,目前队列有"+queue.size()+"个数据");
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}).start(); } new Thread(new Runnable()
{
@Override
public void run()
{
while(true){
try
{
//将此处的睡眠时间改为200和2000 分别观察结果
Thread.sleep(2000);
System.out.println("线程"+Thread.currentThread().getName()+" 准备取数据了");
queue.take();
System.out.println("线程"+Thread.currentThread().getName()+" 已经取完数据了,目前队列有"+queue.size()+"个数据");
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}).start();
}
}
部分运行结果如下,
线程Thread-1 准备放数据了
线程Thread-0 准备放数据了
线程Thread-1 已经放完数据了,目前队列有1个数据
线程Thread-0 已经放完数据了,目前队列有2个数据
线程Thread-2 准备取数据了
线程Thread-2 已经取完数据了,目前队列有1个数据
线程Thread-1 准备放数据了
线程Thread-0 准备放数据了
线程Thread-1 已经放完数据了,目前队列有2个数据
线程Thread-0 已经放完数据了,目前队列有3个数据
线程Thread-1 准备放数据了
线程Thread-0 准备放数据了
线程Thread-2 准备取数据了
线程Thread-2 已经取完数据了,目前队列有2个数据
线程Thread-1 已经放完数据了,目前队列有3个数据
线程Thread-1 准备放数据了
线程Thread-2 准备取数据了
线程Thread-2 已经取完数据了,目前队列有2个数据
线程Thread-0 已经放完数据了,目前队列有3个数据
线程Thread-0 准备放数据了
线程Thread-2 准备取数据了
线程Thread-2 已经取完数据了,目前队列有2个数据
线程Thread-1 已经放完数据了,目前队列有3个数据
线程Thread-1 准备放数据了
线程Thread-2 准备取数据了
线程Thread-2 已经取完数据了,目前队列有2个数据
线程Thread-0 已经放完数据了,目前队列有3个数据
线程Thread-0 准备放数据了
* 面试题
* 需求:
* 子线程循环输出10次
* 接着主线程循环输出100次
* 接着又回到子线程执行10次
* 再回到主线程执行100次
* 如此往复50次 请写出程序
* 此处使用阻塞队列来实现
public class BlockingQueueCommunication
{
public static void main(String[] args) throws InterruptedException
{
final Core core = new Core();
//子线程
new Thread(
new Runnable()
{
@Override
public void run()
{
for (int i = 1; i <= 50;i++)
{
core.SubMethod(i);
}
}
}
).start(); //主线程
for (int i = 1; i <= 50; i++)
{
core.MainMethod(i);
}
} /**
* 创建一个静态的类
* 将核心的业务逻辑的方法放在这里
* 体现了高内聚的特点
* @author huang.jf
*
*/
static class Core{
//创建两个阻塞队列 都只能装一个元素
//实现的效果就是q1存,q2取,q2存,q1取
//用两个具有一个空间的队列来实现同步通知的功能
private BlockingQueue<Integer> queue1 = new ArrayBlockingQueue<Integer>(1);
private BlockingQueue<Integer> queue2 = new ArrayBlockingQueue<Integer>(1); //匿名构造方法 也叫非静态代码块
//当创建对象时 该代码块先被执行
//保证初始化,在queue2队列中包含一个元素
{
try
{
queue2.put(1);
} catch (InterruptedException e)
{
e.printStackTrace();
}
} //子线程调用 循环输出10次
public void SubMethod(int j){
try
{
queue1.put(1);//向q1中存入一个值
} catch (InterruptedException e)
{
e.printStackTrace();
}
for (int i = 1; i <= 10; i++)
{
System.out.println("this is sub thread..."+i+"......."+j);
}
try
{
queue2.take();//取出q2中的一个值
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
//主线程调用循环输出一百次
public void MainMethod(int j){
try
{
queue2.put(1);//一开始queue2队列会被阻塞,因为初始化的时候已经有一个值
} catch (InterruptedException e)
{
e.printStackTrace();
}
for (int i = 1; i <= 100; i++)
{
System.out.println("this is main thread..."+i+"......"+j);
}
try
{
queue1.take();
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
部分运行结果如下:
this is sub thread...1.......49
this is sub thread...2.......49
this is sub thread...3.......49
this is sub thread...4.......49
this is sub thread...5.......49
this is sub thread...6.......49
this is sub thread...7.......49
this is sub thread...8.......49
this is sub thread...9.......49
this is sub thread...10.......49
this is main thread...1......49
this is main thread...2......49
this is main thread...3......49
this is main thread...4......49
this is main thread...5......49
this is main thread...6......49
this is main thread...7......49
this is main thread...8......49
this is main thread...9......49
this is main thread...10......49
this is main thread...11......49
this is main thread...12......49
this is main thread...13......49
this is main thread...14......49
this is main thread...15......49
this is main thread...16......49
this is main thread...17......49
this is main thread...18......49
this is main thread...19......49
this is main thread...20......49
this is main thread...21......49
this is main thread...22......49
this is main thread...23......49
this is main thread...24......49
this is main thread...25......49
this is main thread...26......49
this is main thread...27......49
this is main thread...28......49
this is main thread...29......49
this is main thread...30......49
this is main thread...31......49
this is main thread...32......49
this is main thread...33......49
this is main thread...34......49
this is main thread...35......49
this is main thread...36......49
this is main thread...37......49
this is main thread...38......49
this is main thread...39......49
this is main thread...40......49
this is main thread...41......49
this is main thread...42......49
this is main thread...43......49
this is main thread...44......49
this is main thread...45......49
this is main thread...46......49
this is main thread...47......49
this is main thread...48......49
this is main thread...49......49
this is main thread...50......49
this is main thread...51......49
this is main thread...52......49
this is main thread...53......49
this is main thread...54......49
this is main thread...55......49
this is main thread...56......49
this is main thread...57......49
this is main thread...58......49
this is main thread...59......49
this is main thread...60......49
this is main thread...61......49
this is main thread...62......49
this is main thread...63......49
this is main thread...64......49
this is main thread...65......49
this is main thread...66......49
this is main thread...67......49
this is main thread...68......49
this is main thread...69......49
this is main thread...70......49
this is main thread...71......49
this is main thread...72......49
this is main thread...73......49
this is main thread...74......49
this is main thread...75......49
this is main thread...76......49
this is main thread...77......49
this is main thread...78......49
this is main thread...79......49
this is main thread...80......49
this is main thread...81......49
this is main thread...82......49
this is main thread...83......49
this is main thread...84......49
this is main thread...85......49
this is main thread...86......49
this is main thread...87......49
this is main thread...88......49
this is main thread...89......49
this is main thread...90......49
this is main thread...91......49
this is main thread...92......49
this is main thread...93......49
this is main thread...94......49
this is main thread...95......49
this is main thread...96......49
this is main thread...97......49
this is main thread...98......49
this is main thread...99......49
this is main thread...100......49
this is sub thread...1.......50
this is sub thread...2.......50
this is sub thread...3.......50
this is sub thread...4.......50
this is sub thread...5.......50
this is sub thread...6.......50
this is sub thread...7.......50
this is sub thread...8.......50
this is sub thread...9.......50
this is sub thread...10.......50
this is main thread...1......50
this is main thread...2......50
this is main thread...3......50
this is main thread...4......50
this is main thread...5......50
this is main thread...6......50
this is main thread...7......50
this is main thread...8......50
this is main thread...9......50
this is main thread...10......50
this is main thread...11......50
this is main thread...12......50
this is main thread...13......50
this is main thread...14......50
this is main thread...15......50
this is main thread...16......50
this is main thread...17......50
this is main thread...18......50
this is main thread...19......50
this is main thread...20......50
this is main thread...21......50
this is main thread...22......50
this is main thread...23......50
this is main thread...24......50
this is main thread...25......50
this is main thread...26......50
this is main thread...27......50
this is main thread...28......50
this is main thread...29......50
this is main thread...30......50
this is main thread...31......50
this is main thread...32......50
this is main thread...33......50
this is main thread...34......50
this is main thread...35......50
this is main thread...36......50
this is main thread...37......50
this is main thread...38......50
this is main thread...39......50
this is main thread...40......50
this is main thread...41......50
this is main thread...42......50
this is main thread...43......50
this is main thread...44......50
this is main thread...45......50
this is main thread...46......50
this is main thread...47......50
this is main thread...48......50
this is main thread...49......50
this is main thread...50......50
this is main thread...51......50
this is main thread...52......50
this is main thread...53......50
this is main thread...54......50
this is main thread...55......50
this is main thread...56......50
this is main thread...57......50
this is main thread...58......50
this is main thread...59......50
this is main thread...60......50
this is main thread...61......50
this is main thread...62......50
this is main thread...63......50
this is main thread...64......50
this is main thread...65......50
this is main thread...66......50
this is main thread...67......50
this is main thread...68......50
this is main thread...69......50
this is main thread...70......50
this is main thread...71......50
this is main thread...72......50
this is main thread...73......50
this is main thread...74......50
this is main thread...75......50
this is main thread...76......50
this is main thread...77......50
this is main thread...78......50
this is main thread...79......50
this is main thread...80......50
this is main thread...81......50
this is main thread...82......50
this is main thread...83......50
this is main thread...84......50
this is main thread...85......50
this is main thread...86......50
this is main thread...87......50
this is main thread...88......50
this is main thread...89......50
this is main thread...90......50
this is main thread...91......50
this is main thread...92......50
this is main thread...93......50
this is main thread...94......50
this is main thread...95......50
this is main thread...96......50
this is main thread...97......50
this is main thread...98......50
this is main thread...99......50
this is main thread...100......50
java 5并发中的阻塞队列ArrayBlockingQueue的使用以及案例实现的更多相关文章
- Java中的阻塞队列-ArrayBlockingQueue(一)
最近在看一些java基础的东西,看到了队列这章,打算对复习的一些知识点做一个笔记,也算是对自己思路的一个整理,本章先聊聊java中的阻塞队列 参考文章: http://ifeve.com/java-b ...
- Java核心知识点学习----多线程中的阻塞队列,ArrayBlockingQueue介绍
1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过s ...
- 聊聊并发(七)——Java中的阻塞队列
3. 阻塞队列的实现原理 聊聊并发(七)--Java中的阻塞队列 作者 方腾飞 发布于 2013年12月18日 | ArchSummit全球架构师峰会(北京站)2016年12月02-03日举办,了解更 ...
- java并发编程学习: 阻塞队列 使用 及 实现原理
队列(Queue)与栈(Stack)是数据结构中的二种常用结构,队列的特点是先进先出(First In First Out),而Stack是先进后出(First In Last Out),说得通俗点: ...
- Java并发编程:阻塞队列(转载)
Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList), ...
- 【转】Java并发编程:阻塞队列
在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList),这些工具都为我们编写多线程程 ...
- 12、Java并发编程:阻塞队列
Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList), ...
- Java中的阻塞队列(BlockingQueue)
1. 什么是阻塞队列 阻塞队列(BlockingQueue)是 Java 5 并发新特性中的内容,阻塞队列的接口是 java.util.concurrent.BlockingQueue,它提供了两个附 ...
- 多线程编程学习六(Java 中的阻塞队列).
介绍 阻塞队列(BlockingQueue)是指当队列满时,队列会阻塞插入元素的线程,直到队列不满:当队列空时,队列会阻塞获得元素的线程,直到队列变非空.阻塞队列就是生产者用来存放元素.消费者用来获取 ...
随机推荐
- 解析XML的方法
解析XML的方法 1.DOM生成和解析XML 2.SAX生成和解析XML 3.DOM4J生成和解析XML 4.JDOM生成和解析XML
- Linux查看磁盘剩余空间
Linux查看磁盘剩余空间 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ df 文件系统 1K-blocks 已用 可用 已用% 挂载点 /dev/sda8 ...
- windows驱动程序wdf--KMDF获取应用程序数据缓冲区地址
有3种常用方式:METHOD_BUFFERED METHOD_IN_DIRECT METHOD_OUT_DIRECT 还有METHOD_NEITHER,<windows设备驱动WDF开发 ...
- NVIDIA Geforce GT 730 OpenGL 图形显示异常花屏
原因:C盘空间爆表,用dism++清理.结果用力过猛,清完后程序里的图形直接马赛克了... 上个图感受一下吧... 嘿别说,还有那么点艺术风! 别闹了,这个问题很严重,很严肃好不好! 因为程序和数据都 ...
- Matlab和C语言混合编程,包含目录的设定
如果.c文件不依赖于任何第三方库,那么mex编译很简单,只需要在matlab的命令行输入 mex test.c 即可. 但是如果这个c文件使用了第三方库文件,如opencv.gsl等等,那么就需要更改 ...
- freemarker基本数据类型(十一)
freemarker基本数据类型 1.基本数据类型 (1)字符串 (2)数字 (3)布尔值 (4)日期 2.展示示例 <html> <head> <meta http-e ...
- Halcon算子--区域特征
当我们想要提取Region时,图像处理后,往往存在几个类似的Region,此时,需要根据Region的一些特殊特征,来选择指定的Region. 求Region指定特征值:region_features ...
- java第一个程序——Hello World
Hello World 如果没有下载jdk以及配置环境变量的萌新请自行百度,教程非常的详细(参考:https://jingyan.baidu.com/article/6dad5075d1dc40a12 ...
- json数组本地获取,以及根据字段排序【部分摘录】
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- luoguP2711 小行星
题目描述 星云中有n颗行星,每颗行星的位置是(x,y,z).每次可以消除一个面(即x,y或z坐标相等)的行星,但是由于时间有限,求消除这些行星的最少次数. 输入输出格式 输入格式: 第1行为小行星个数 ...