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. java小程序

    1.水仙花数 这个数等于它的每位数的立方和 (三位数) 示例一: int i; int j; int k; for (i=1;i<=9;i++) { for (j=0;j<=9;j++){ ...

  2. Droid VNC Server

    这个app可以在Android开启VNC Server,让其他的VNC Client远程连接手机,不过前提是要ROOT.哎,可惜了. 当然还有另一款替代品Total Control http://ww ...

  3. iframe 跨域自适应 纯css解决方法

    <style type="text/css">body{background:#f00;}body, html,#ifm1{width:100%;height:100% ...

  4. [HackerCup Round1 2] Autocomplete (Trie)

    题目链接:https://www.facebook.com/hackercup/problems.php?pid=313229895540583&round=344496159068801 题 ...

  5. (转)卸载SQLServer2008 数据库

    1 卸载Microsoft SQL Server 2008主程序 1.1,控制面板-程序中找到“Microsoft SQL Server 2008”,双击卸载 1.2,弹出管理界面中选择“”删除“ 1 ...

  6. Beginning SDL 2.0(1) SDL功能简介

    原文链接为 http://wiki.libsdl.org/Introduction. 由于近期整理音视频可视化的技术,发现好久不更新的SDL发布了2.0版本,以前也没有过于关注,这里准备尝试下.了解S ...

  7. C++历史(The History of C++)

    C++历史 早期C++ •1979: 首次实现引入类的C(C with Classes first implemented) 1.新特性:类.成员函数.继承类.独立编译.公共和私有访问控制.友元.函数 ...

  8. express 4.x 模板引擎与express.static

    前提:要在express中使用模块引擎需要将要使用的模板引擎安装在本项目,当然,express也是要安装的.在下面实例中,我使用的模板引擎是pug(一起叫做jade) 我的目录结构如下: 根目录为st ...

  9. 【LeetCode】19. Remove Nth Node From End of List

    题目: 思路:如果链表为空或者n小于1,直接返回即可,否则,让链表从头走到尾,每移动一步,让n减1. 1.链表1->2->3,n=4,不存在倒数第四个节点,返回整个链表 扫过的节点依次:1 ...

  10. 【PL/SQL练习】复合变量: 可以一次传递多个值到变量中。

    1.案例: 通过record类型处理一行多列的数据 复合变量--record 记录类型record:在一个变量中可以存储多个区域,每个区域可以是一个标量.记录或table (用于处理一行多列的信息) ...