您的位置:首页 > 产品设计 > UI/UE

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();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: