public class MyQueue {

    //定义一个存储数据的容器
private LinkedList<Object> list = new LinkedList<Object>(); //定义容器的最小容量
private int minSize = 0; //定义容器的最大容量
private int maxSize; //定义队列的长度
private AtomicInteger size = new AtomicInteger(0); //定义一个锁对象
private Object lock = new Object(); public MyQueue(int maxSize){
this.maxSize = maxSize;
} //put方法,向队列中假数据,如果队列满则阻塞直到有空闲的空间
public void put(Object obj){
synchronized (lock) {
while(maxSize == size.get()){
try {
//1.如果队列满,则阻塞
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//2.如果有空间了,首先添加一个元素
list.add(obj);
//3.当前的size加1
size.incrementAndGet();
System.out.println("存入元素"+obj);
//4.唤醒所有的take等待线程
lock.notify();
}
} //take方法,从队列中取数据,如果队列为空,那么阻塞直到有一个可用元素为止
public Object take(){
Object ret = null;
synchronized (lock) {
while(minSize == size.get()){
try {
//1.如果队列中没有元素,则等待
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//2.如果队列中有值了,取出值
ret = list.removeFirst();
//3.队列的长度减1
size.decrementAndGet();
//4.唤醒所有的put等待线程
lock.notify();
System.out.println("取出元素"+ret);
}
return ret;
} //得到当前的长度
public int getSize(){
return size.get();
} public static void main(String[] args) throws InterruptedException { final MyQueue myQueue = new MyQueue(5);
myQueue.put("1");
myQueue.put("2");
myQueue.put("3");
myQueue.put("4");
myQueue.put("5"); System.out.println("myQueue的长度是:"+myQueue.getSize()); Thread t1 = new Thread(new Runnable() {
public void run() {
myQueue.put("6");
myQueue.put("7");
}
},"t1"); t1.start(); TimeUnit.SECONDS.sleep(5); Thread t2 = new Thread(new Runnable() {
public void run() {
myQueue.take();
myQueue.take();
}
},"t1");
t2.start();
} }

执行结果:

存入元素1
存入元素2
存入元素3
存入元素4
存入元素5
myQueue的长度是:
取出元素1
取出元素2
存入元素6
存入元素7

使用notiy和wait模拟阻塞队列的更多相关文章

  1. java多线程系列10 阻塞队列模拟

    接下来的几篇博客会介绍下juc包下的相关数据结构 包含queue,list,map等 这篇文章主要模拟下阻塞队列. 下面是代码 import java.util.LinkedList; import ...

  2. java并发编程学习: 阻塞队列 使用 及 实现原理

    队列(Queue)与栈(Stack)是数据结构中的二种常用结构,队列的特点是先进先出(First In First Out),而Stack是先进后出(First In Last Out),说得通俗点: ...

  3. [Java 基础] 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法

    reference : http://www.cnblogs.com/linjiqin/archive/2013/05/30/3108188.html 在Java多线程应用中,队列的使用率很高,多数生 ...

  4. 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法

    在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出).Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQ ...

  5. lesson2:java阻塞队列的demo及源码分析

    本文向大家展示了java阻塞队列的使用场景.源码分析及特定场景下的使用方式.java的阻塞队列是jdk1.5之后在并发包中提供的一组队列,主要的使用场景是在需要使用生产者消费者模式时,用户不必再通过多 ...

  6. 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法(转)

    在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出).Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQ ...

  7. Java多线程高并发学习笔记——阻塞队列

    在探讨可重入锁之后,接下来学习阻塞队列,这边篇文章也是断断续续的写了很久,因为最近开始学ssm框架,准备做一个自己的小网站,后续可能更新自己写网站的技术分享. 请尊重作者劳动成果,转载请标明原文链接: ...

  8. 并发库应用之十一 & 阻塞队列的应用

    队列包含固定长度的队列和不固定长度的队列,队列的规则就是:先进先出.固定长度的队列往里放数据,如果放满了还要放,阻塞式队列就会等待,直到有数据取出,空出位置后才继续放:非阻塞式队列不能等待就只能报错了 ...

  9. BlockingQueue 阻塞队列实现异步事件

    转载请注明出处:https://www.cnblogs.com/wenjunwei/p/10411444.html 前言 本文通过一个简单的例子,来展现如何使用阻塞队列(BlockingQueue)来 ...

随机推荐

  1. struts (二)

    1.运行流程 client --->tomcat  ---> webapp  -->web.xml --->filter -->struts.xml ---->na ...

  2. [ActionScript 3.0] AS3 双A字模型

    package { import caurina.transitions.Tweener; import flash.display.Sprite; import flash.events.Mouse ...

  3. EXt form属性

    配置项: success:执行成功后回调的函数,包括两个参数:form和action failure:执行失败后回调的函数,包括两个参数:form和action method:表单的提交方式,有效值包 ...

  4. Chrome内嵌 FlashPlayer(PPAPI)会被页面DHTML元素遮住的问题

    flash的wmode为window,Chrome版本为29.0.1547.66 m,Flash PPAPI为11.8.800.97,Flash NPAPI为11,8,800,94. flash在正常 ...

  5. 关于 C/C++ 的文章

    关于 C/C++ 的文章,以前写的博客在百度,百度关了,只能一个一个复制了,百度太.....

  6. svn 终端命令

    你可以仅仅删除冲突的文件并且提交,但是svn resolved除了删除冲突文件,还修正了一些记录在工作拷贝管理区域的记录数据,所以我们推荐你使用这个命令. 恢复本地修改  svn revert [-- ...

  7. Linux-wget/tar/ln 函数

    1. 获取软件包,可以使用wget的方式, ubuntu可以使用apt-get source来获取源代码 wget 是一个在网络上进行下载的简单而强大的自由软件,支持HTTP,HTTPS,FTP协议, ...

  8. CA提供的身份认证配置弃用

    场景:从CA网站登录,在CA主页点击我们集成到CA的业务系统图标进行跳转,发现业务系统登录过身份(没cookies),身份认证自动使用 url,跳转到CA登录页,造成二次登录 [Authorize] ...

  9. Android基础总结(10)——手机多媒体的运用:通知、短信、相机、视频播放

    Android提供了一系列的API,是我们可以在程序中调用很多手机的多媒体资源,从而编写出更加丰富的应用程序. 1.通知的使用 通知(Notification)是Android中比较有特色的一个功能, ...

  10. 用C#访问SSRS自动导出SSRS报表

    一.              新建一个winform应用程序WindowsFormsApplication1 二.              添加web引用 . 报表服务:http://dbpdhk ...