wait , notify 模拟 Queue
package com.itdoc.multi.sync009; import java.util.LinkedList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger; /**
* @BLOG http://www.cnblogs.com/goodcheap
* @DESCRIBE wait, notify 模拟 Queue
* @AUTHOR WángChéngDá
* @DATE 2017-03-25 9:26
*/
public class MyQueue { //1.创建容器
private LinkedList<Object> list = new LinkedList<>(); //2.构建计数器
private AtomicInteger count = new AtomicInteger(0); //3.设置容器的容量上下限
private final int minSize = 0;
private final int maxSize; //4.创建设置容器上限的构造器
public MyQueue(int maxSize) {
this.maxSize = maxSize;
} //5.设置对象锁
final Object lock = new Object(); //put: 将对象放入容器中, 假如容器容量到达上限, 将线程阻塞, 等待唤醒。
public void put(Object obj) {
synchronized (lock) {
if (this.maxSize == count.get()) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//将对象放入容器
list.add(obj);
//计入计数器
count.incrementAndGet();
//假如一线程提取容器中元素而因为容器为空进入阻塞状态, 容器中添加元素后将其唤醒。
lock.notify();
System.out.println("Add a new element to " + obj);
}
}
//take: 将对象从容器中取出, 假如容器没有任何元素, 将线程阻塞, 等待唤醒。
public Object take() {
Object obj = null;
synchronized (lock) {
if (this.minSize == count.get()) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//获取容器中第一个元素
obj = list.removeFirst();
//计入计数器
count.decrementAndGet();
//假如一线程向容器中放入元素而因容器到达上限进入阻塞状态, 将容器第一个元素取出后将其唤醒。
lock.notify();
System.out.println("Remove an element to " + obj);
}
return obj;
} public static void main(String[] args) throws InterruptedException {
final MyQueue mq = new MyQueue(5);
mq.put("a");
mq.put("b");
mq.put("c");
mq.put("d");
mq.put("e");
System.out.println("容器中元素有: " + mq.size() + "个。"); new Thread(() -> {
System.out.println("Enter the " + Thread.currentThread().getName());
mq.put("f");
mq.put("g");
System.out.println(Thread.currentThread().getName() + " Thread stop...");
}, "T1").start(); TimeUnit.SECONDS.sleep(2); new Thread(() -> {
System.out.println("Enter the " + Thread.currentThread().getName());
mq.take();
mq.take();
System.out.println(Thread.currentThread().getName() + " Thread stop...");
}, "T2").start();
/**
* 解决: ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
* JDWP exit error AGENT_ERROR_NO_JNI_ENV(183): [util.c:840]
*/
System.exit(0);
} private int size() {
return this.count.get();
}
}
控制台输出:
|
Add a new element to a |
wait , notify 模拟 Queue的更多相关文章
- 1. 模拟Queue
package com.gf.conn009; import java.util.LinkedList; import java.util.concurrent.atomic.AtomicIntege ...
- 模拟Queue(wait/notify)
BlockingQueue:顾名思义,首先它是一个队列,并且支持阻塞的机制,阻塞的放入和得到数据.我们要实现LinkedBlockingQueue下面的两个方法put和take. put(anObje ...
- Codeforces Round #366 (Div. 2) C 模拟queue
C. Thor time limit per test 2 seconds memory limit per test 256 megabytes input standard input outpu ...
- CF #366 DIV2 C. Thor 模拟 queue/stack降低复杂度
C. Thor time limit per test 2 seconds memory limit per test 256 megabytes input standard input outpu ...
- scheme 模拟queue
[code 1] shows a implementation of queue. The function enqueue! returns a queue in that the obj is a ...
- wait/notify模拟线程池
线程创建和销毁会消耗很多的资源,当我们创建线程时,会发现cpu利用率很高,为了节省资源的使用,使用线程池是一个比较好的选择,当有任务需要执行时,随机分配给一条线程去执行,也可以删除任务,获取任务数量等 ...
- wait/notify模拟连接池
连接池中的连接可重复使用,减少每次新建和烧毁连接对资源的消耗,但连接池的容量大小也要设置合理,否则也会占用多余的资源.连接池的基本功能是获取连接和释放连接 连接在java中也是一个类,连接对象是一个普 ...
- 用数组模拟STL中的srack(栈)和queue(队列)
我们在理解stack和queue的基础上可以用数组来代替这两个容器,因为STL中的stack和queue有可能会导致程序运行起来非常的慢,爆TLE,所以我们使用数组来模拟他们,不仅可以更快,还可以让代 ...
- 话说 wait、notify 、 notifyAll
一.前言 说起java的线程之间的通信,难免会想起它,他就是 wait .notify.notifyAll 他们三个都是Object类的方法, 受到 final 和 native 加持 ,也就造就了他 ...
随机推荐
- [HDU1512]Monkey King(左偏树)
用并查集维护猴子们的关系,强壮值用左偏树维护就行了 Code #include <cstdio> #include <algorithm> #include <cstri ...
- c++ map的使用方法
1.头文件:#include<map> 2.定义:map<typename1,typename2> mp 注:字符串数组只能用string而不能使用char[] 3.访问方式: ...
- python os模块atime ,ctime,mtime意义
ython的os.stat中主要的时间信息有三个:st_mtime,st_atime,st_ctime. 1.st_mtime:time of last modification 最后一 ...
- 清除远程桌面连接记录和SQLSERVER 连接记录的办法
1.清除远程桌面连接记录: 清除远程桌面访问痕迹.使用windows系统自带的“远程桌面协助”mstsc进行远程,如果连接的用户多了,会留下访问的痕迹.虽然能带来方便,但是如果对于公用电脑来说,这些访 ...
- [转][赞]Android开发者必知的开发资源
英文原文:Bongzimo 翻译: ImportNew-黄小非 随着Android平台市场份额的持续猛增 ,越来越多的开发者开始投入Android应用程序的开发大潮.如果您是一位2013年刚刚入行的 ...
- 阿牛的EOF牛肉串(递推)
阿牛的EOF牛肉串 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Sub ...
- 怎样安装PyCharm
在地址栏输入http://www.jetbrains.com/pycharm/ 打开PyCharm官网 http://idea.lanyus.com/
- Windows系统的高效使用
1-WIndows10系统的入门使用 2-如何把系统盘的用户文件转移到其他盘 3-Windows装机软件一般有哪些? 4-Windows系统有哪些比较好用的下载器? 5-Windows系统中的播放器 ...
- [POJ3585]Accumulation Degree
题面 \(\text{Solution:}\) 有些题目不仅让我们做树型 \(\text{dp}\) ,而且还让我们换每个根分别做一次, 然后这样就愉快的 \(\text{TLE}\) 了,所以我们要 ...
- UZH slam 两种相机
1.event camera:http://rpg.ifi.uzh.ch/research_dvs.html 2.SCAMP Vision Sensor:https://personalpages.m ...