使用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)来 ...
随机推荐
- [ActionScript] AS3 绘制虚线
import flash.geom.Point; import flash.display.MovieClip; import flash.display.Graphics; function dra ...
- relative和absolute的效果
我对这样几个效果不是特别理解: 1.float的效果: 就是搞不清楚我想要什么效果的时候可以将某个标签设置为float,一直没总结出什么规律. 2.relative和absolute的效果: 也是不清 ...
- MVC 4 与WebForm 混合应用 WebApi 发布常见问题
1.所有应用的MVC相关程序集编译时要选择复制到本地,需要用到的程序如下图 2.IIS设置: 因为 IIS 7/8 采用了更安全的 web.config 管理机制,默认情况下会锁住配置项不允许更改.运 ...
- [kuangbin带你飞]专题十一 网络流
ID Origin Title 34 / 81 Problem A POJ 3436 ACM Computer Factory 92 / 195 Problem B POJ 3 ...
- Redo与undo在开发中的使用
redo:记录用户的操作.(commit) undo:相反的用操作.(rollback) checkpoint:redo真正写入物理存储.(定时写---定时策略) ================== ...
- 30. Distinct Subsequences
Distinct Subsequences OJ: https://oj.leetcode.com/problems/distinct-subsequences/ Given a string S a ...
- mysql 使用说明-1
以下内容是根据官方文档翻译的,执行截图是博主自己实测结果. 3.1 Connecting to and Disconnecting from the Server 连接,断开数据库 要连接到mysql ...
- IIS错误代码表
当用户试图通过 HTTP 或文件传输协议 (FTP) 访问一台正在运行 Internet 信息服务 (IIS) 的服务器上的内容时,IIS 返回一个表示该请求的状态的数字代码.该状态代码记录在 IIS ...
- 模糊查询(LIKE)and (PATINDEX() . CHARINDEX())
SQL中的模糊查询一般来说使用模糊查询,大家都会想到LIKE select * from table where a like '%字符%' 如果一个SQL语句中用多个 like模糊查询,并且记录条 ...
- C++ 中的返回值
C++中大致有三种返回值:值拷贝(副本),值引用和指针,返回什么类型的值要根据当时情况而定. 如果返回的是大型对象的副本,那么在每一次的函数调用后返回,都会调用该对象类型的拷贝构造函数构造一个新的副本 ...