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)是指当队列满时,队列会阻塞插入元素的线程,直到队列不满:当队列空时,队列会阻塞获得元素的线程,直到队列变非空.阻塞队列就是生产者用来存放元素.消费者用来获取 ...
随机推荐
- XmlDocument 转换为xml字符串
static public string XMLDocumentToString(XmlDocument doc) { MemoryStream stream = new Me ...
- 芝麻HTTP:Ajax结果提取
以微博为例,接下来用Python来模拟这些Ajax请求,把我发过的微博爬取下来. 1. 分析请求 打开Ajax的XHR过滤器,然后一直滑动页面以加载新的微博内容.可以看到,会不断有Ajax请求发出. ...
- Codeforces Round #454 D. Seating of Students
分三类 1 1: 一个就好了 3 3:特殊讨论下 或 : 第一行奇序号的数放前面,偶序号的数放后面,第二行奇序号的数放前面,偶序号的数放后面,第二行依次类推 有点难写,真的菜 #include< ...
- ASP.NET Core轻松入门Bind读取配置文件到C#实例
首先新建一个ASP.NET Core空项目,命名为BindReader 然后 向项目中添加一个名为appsettings.json的json文件,为什么叫appsettings呢? 打开Progra ...
- 微信小程序hidden
首先hidden默认在display:block;情况下是会默认生效的: but在很多时候只在初始值下有效, 在data下声明 flag:true; 方法中: 无效,所以尽量不要使用hidden这个属 ...
- 论文笔记(1):From Image-level to Pixel-level Labeling with Convolutional Networks
文章采用了多实例学习(MIL)机制构建图像标签同像素语义的关联 . 该方法的训练样本包含了70 万张来自ImageNet的图片,但其语义分割的性能很大程度上依赖于复杂的后处理过程,主要包括图像级语义的 ...
- java 动态代理 , 多看看。 多用用。
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import java.lang.reflect ...
- VS中Ctrl+F5(开始执行不调试)一闪而过问题
昨天学弟学妹在使用VS2015时,遇到了Ctrl+F5运行完毕程序窗口不能停留的问题,感觉比较奇怪.后来了解到他们建立C++解决方案时,直接选中的是空项目,而这样就会导致这样的现象. 想要达到运行完毕 ...
- 消息队列的使用 RabbitMQ
RabbitMQ 是一款开源且比较流行的消息中间件.但用起来还是比较麻烦,有人封装了一层, 这就是 EasyNetQ . 一.安装 1.安装 Erlang: http://www.erlang.org ...
- Navicat通过跳板机连接数据库
完成对应设置后,即可连接数据库,本人亲测!