queue模拟小案例
2017-08-02 19:13
281 查看
public class MyQueue {
//1需要一个承载元素的集合
private LinkedList<Object> list = new LinkedList<Object>();
//2需要一个计数器
private AtomicInteger count = new AtomicInteger(0);
//3需要上下限
private final int minSize = 0;
private final int maxSize;
//4构造方法
public MyQueue(int size) {
this.maxSize = size;
}
//5初始化一个对象加锁
private final Object lock = new Object();
public void put(Object obj){
synchronized (lock) {
while(count.get() == this.maxSize){
try{
lock.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
//加入元素
list.add(obj);
System.out.println("新加入的元素为:"+obj);
//计数器累积
count.incrementAndGet();
//唤醒操作
lock.notify();
}
}
public Object take(){
Object ret = null;
synchronized (lock) {
while(count.get() == this.minSize){
try {
lock.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//移除元素操作
ret = list.removeFirst();
//计数器递减
count.decrementAndGet();
//唤醒另外一个线程
lock.notify();
}
return ret;
}
public int getSize(){
return this.count.get();
}
public static void main(String[] args) {
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.getSize());
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
mq.put("f");
mq.put("g");
}
},"t1");
t1.start();
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Object o1 = mq.take();
System.out.println("移除的元素为:"+o1);
Object o2 = mq.take();
System.out.println("移除的元素为:"+o2);
}
},"t2");
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t2.start();
}
}
//1需要一个承载元素的集合
private LinkedList<Object> list = new LinkedList<Object>();
//2需要一个计数器
private AtomicInteger count = new AtomicInteger(0);
//3需要上下限
private final int minSize = 0;
private final int maxSize;
//4构造方法
public MyQueue(int size) {
this.maxSize = size;
}
//5初始化一个对象加锁
private final Object lock = new Object();
public void put(Object obj){
synchronized (lock) {
while(count.get() == this.maxSize){
try{
lock.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
//加入元素
list.add(obj);
System.out.println("新加入的元素为:"+obj);
//计数器累积
count.incrementAndGet();
//唤醒操作
lock.notify();
}
}
public Object take(){
Object ret = null;
synchronized (lock) {
while(count.get() == this.minSize){
try {
lock.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//移除元素操作
ret = list.removeFirst();
//计数器递减
count.decrementAndGet();
//唤醒另外一个线程
lock.notify();
}
return ret;
}
public int getSize(){
return this.count.get();
}
public static void main(String[] args) {
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.getSize());
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
mq.put("f");
mq.put("g");
}
},"t1");
t1.start();
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Object o1 = mq.take();
System.out.println("移除的元素为:"+o1);
Object o2 = mq.take();
System.out.println("移除的元素为:"+o2);
}
},"t2");
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t2.start();
}
}
相关文章推荐
- UVA133 The Dole Queue【模拟】
- HDU 1387 Team Queue (队列模拟)
- 模拟一个TCP数据注入劫持的案例
- bash shell数组模拟队列queue和shell数组使用技巧
- (案例六)三种scrapy模拟登陆策略
- 第113课:Spark Streaming电商广告点击综合案例实战模拟点击数据的生成和数据表SQL建立
- xpath技术解析xml以及案例模拟用户登录效果
- SPOJ - ADAQUEUE - Ada and Queue - 模拟+双端队列 - Mutual Training for Wannafly Union #7
- Akka编写一个RPC框架,模拟多个Worker连接Master的情况的案例
- Java基础之模拟购物系统案例
- STL综合案例-模拟演讲比赛
- IO流_自定义类模拟BufferedReader的readLine()功能案例
- 模拟实现一个秒杀减库存的案例
- 小案例:物体追随鼠标轨迹移动,关于Queue的运用
- LoadRunner案例:模拟不同情况下用户性能测试分析
- 2018_2_3_Team Queue_队列_模拟_手撕
- uva540 Team Queue(模拟:队列)
- hdu4393(模拟+queue)
- xpath技术解析xml以及案例模拟用户登录效果
- poj 2259 Team Queue (模拟)