使用notiy和wait模拟阻塞队列
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模拟阻塞队列的更多相关文章
- java多线程系列10 阻塞队列模拟
接下来的几篇博客会介绍下juc包下的相关数据结构 包含queue,list,map等 这篇文章主要模拟下阻塞队列. 下面是代码 import java.util.LinkedList; import ...
- java并发编程学习: 阻塞队列 使用 及 实现原理
队列(Queue)与栈(Stack)是数据结构中的二种常用结构,队列的特点是先进先出(First In First Out),而Stack是先进后出(First In Last Out),说得通俗点: ...
- [Java 基础] 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
reference : http://www.cnblogs.com/linjiqin/archive/2013/05/30/3108188.html 在Java多线程应用中,队列的使用率很高,多数生 ...
- 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出).Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQ ...
- lesson2:java阻塞队列的demo及源码分析
本文向大家展示了java阻塞队列的使用场景.源码分析及特定场景下的使用方式.java的阻塞队列是jdk1.5之后在并发包中提供的一组队列,主要的使用场景是在需要使用生产者消费者模式时,用户不必再通过多 ...
- 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法(转)
在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出).Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQ ...
- Java多线程高并发学习笔记——阻塞队列
在探讨可重入锁之后,接下来学习阻塞队列,这边篇文章也是断断续续的写了很久,因为最近开始学ssm框架,准备做一个自己的小网站,后续可能更新自己写网站的技术分享. 请尊重作者劳动成果,转载请标明原文链接: ...
- 并发库应用之十一 & 阻塞队列的应用
队列包含固定长度的队列和不固定长度的队列,队列的规则就是:先进先出.固定长度的队列往里放数据,如果放满了还要放,阻塞式队列就会等待,直到有数据取出,空出位置后才继续放:非阻塞式队列不能等待就只能报错了 ...
- BlockingQueue 阻塞队列实现异步事件
转载请注明出处:https://www.cnblogs.com/wenjunwei/p/10411444.html 前言 本文通过一个简单的例子,来展现如何使用阻塞队列(BlockingQueue)来 ...
随机推荐
- POJ 1743 后缀数组不重叠最长重复子串
#include<stdio.h> #include<string.h> #include<algorithm> #define maxn 30000 using ...
- OC基础(3)
对象的存储细节 函数与方法对比 常见错误 *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bot ...
- Redis数据持久化之AOF持久化
一.RDB持久化的缺点创建RDB文件需要将服务器所有的数据库的数据都保存起来,这是一个非常耗费资源和时间的操作,所以服务器需要隔一段时间才能创建一个新的RDB文件,就也是说创建RDB文件的操作不能执行 ...
- cocos2d-x Android版游戏之中国移动SDK嵌入
. 拷贝API 将SDK\runtime\CMBilling20007.jar拷贝至游戏工程的runtime目录下(或其他目录) ,但切记不能放在libs目录下编译,否则编译报错(如:bad rang ...
- Oracle 事务
begin begin savepoint p1; DELETE FROM sys_re_xxx; //红色部分替换为需要一起执行的SQL即可 DELETE FROM SYS_xxxx; ...... ...
- Swift开发中的一些琐碎
1.Swift中使用OC 1.创建 pch 文件,直接引用需要的头文件 #import"SQLite3.h" 2.修改 pct 路径 ,如下图,就可以使用了 2. Swift 没 ...
- rsync安装使用
安装 yum install rsync mkdir /etc/rsyncd cd /etc/rsyncd vi rsyncd.conf pid file = /var/run/rsyncd.pid ...
- noip2008 笨小猴
P1125 笨小猴 1.6K通过 3.7K提交 题目提供者该用户不存在 标签模拟2008NOIp提高组 难度普及- 提交该题 讨论 题解 记录 题目描述 笨小猴的词汇量很小,所以每次做英语选择题的 ...
- 分层服务提供者(LSP)
分层服务提供者(LSP)(1) 开发过滤数据包的LSP程序可以定义过滤规则,恩,先看看LSP本身是DLL,可以将它安装至Winsock目录,创建套接字的应用程序不必知道此LSP的任何信息就能调用它 1 ...
- Response.Write页面跳转
一.<a>标签 <a href=”test.aspx”></a> 这是最常见的一种转向方法 二.HyperLink控件 1. Asp.net 服务器端控件 属性 ...