使用wait和notify模拟queue

来源:互联网 发布:ae圆点矩阵特效是哪个 编辑:程序博客网 时间:2024/04/30 21:44

模拟阻塞的queue


import java.util.LinkedList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;


public class Myqueue {
// 1 需要一个集合 是装元素的
private final LinkedList<Object> list = new LinkedList<Object>();


// 2 在这里需要计数器 统计加入list的个数
private AtomicInteger count = new AtomicInteger(0);


// 3需要制定上线和下线的容量
private final int minsize = 0;
private final int maxsize;


// 构造方法初始化maxsize
public Myqueue(int size) {
this.maxsize = size;
}


// 初始化一个额object对象 用于枷锁
private final Object lock = new Object();


public void put(Object object) {
synchronized (lock) {
// 如果list满了就等待(阻塞 )
while (count.get() == this.maxsize) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 如果不满就给list添加元素
list.add(object); // 1 加入元素
count.incrementAndGet(); // 2 加一个元素 加一个计数器
lock.notify(); // 3 通知另外一个线程
System.out.println("新加入的元素:" + object);


}
}


public Object take() {
Object object = null;
synchronized (lock) {
while (count.get() == this.minsize) {
try {
lock.wait(); // 元素为空的话就处于等待(阻塞)
} catch (InterruptedException e) {
e.printStackTrace();
}
}


// 1 移除第一个元素操作(先进先出原则)
object = list.removeFirst();
// 2 计数器递减
count.decrementAndGet();
// 3 唤醒另外一个线程
lock.notify();


}


return object;
}


// 返回当前容器的个数
private 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() {
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) {
e.printStackTrace();
}


t2.start();


}
}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 樱花勾线笔干了怎么办 枣核卡在喉咙里怎么办 马桶被玉米棒堵了怎么办 雪糕棒掉马桶里了怎么办 食用色素吃多了怎么办 蜡笔弄到指甲里怎么办 小孩把彩笔吃了怎么办 宝宝吃了水彩笔怎么办 宝宝不小心吃了蜡笔怎么办 小孩把蜡笔吃了怎么办 宝宝吃了记号笔怎么办 二年级的孩子不太爱看书怎么办 数字油画涂错了怎么办 白墙上被蜡笔画起来怎么办 衣服上的油画棒怎么办 蜡笔要是涂错了怎么办 蜡笔颜色涂错了怎么办 书被蜡笔涂了怎么办 白灰墙上被蜡笔涂了怎么办 电器上涂了彩色蜡笔怎么办 3d渲大图慢怎么办 23岁就眼皮下垂怎么办 手被猫咪抓破了怎么办 有幻想症的人怎么办 做事不专心老走神怎么办 小朋友做作业老发呆走神怎么办? 小朋友总是上课走神发呆怎么办 21岁精神心急了怎么办 一直有人阻止我做事怎么办 安装了渲染su找不到怎么办 su室内渲染很暗怎么办 su未响应未保存怎么办 电脑工作栏没了怎么办 ps工作栏没了怎么办 草图大师文件太大打不开怎么办 su模型保存后不见了怎么办 墨汁溅到衣服上怎么办 黑裤子溅上白色颜料怎么办 解码器上墙后图像放大了怎么办 宝宝把墙画了怎么办 孩子画画勾线笔过敏怎么办