并发编程复习(六):使用wait和notify模拟阻塞队列
发布日期:2021-11-13 10:21:44 浏览次数:2 分类:技术文章

本文共 1759 字,大约阅读时间需要 5 分钟。

话不多说,代码如下

import java.util.LinkedList;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;/** * 使用wait和notify模拟阻塞队列...... */public class MyQueue {
private int minSize = 0;
private int maxSize;
public MyQueue(int size) {
this.maxSize = size;
}
private LinkedList list = new LinkedList<>();
private AtomicInteger count = new AtomicInteger();
private Object lock = new Object();
public void put(Object obj) {
synchronized (lock) {
while (count.intValue() == maxSize) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
list.add(obj);
System.out.println("添加的元素为:"+obj);
count.incrementAndGet();
lock.notify();
}
}
public Object take() {
Object rel = null;
synchronized (lock) {
while (count.intValue() == minSize) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
rel = list.removeFirst();
System.out.println("移除的元素为:"+rel);
count.decrementAndGet();
lock.notify();
}
return rel;
}
public Integer getSize() {
return list.size();
}
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 thread1 = new Thread(new Runnable() {
@Override
public void run() {
mq.put("f");
mq.put("g");
}
},"thread01:");
thread1.start();
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
 Object o = mq.take();
 System.out.println("取得的元素是:"+o);
 Object o1 = mq.take();
 System.out.println("取得的元素是:"+o1);
}
},"thread02:");
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.start();
}}

输出结果:

添加的元素为:a添加的元素为:b添加的元素为:c添加的元素为:d添加的元素为:e队列中的对象个数为:5移除的元素为:a添加的元素为:f取得的元素是:a移除的元素为:b取得的元素是:b添加的元素为:g


转载地址:https://blog.csdn.net/Lee_Ho_/article/details/78056459 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:并发编程复习(七):并发类容器ConcurrentHashMap&CopyOnWrite
下一篇:并发编程复习(五):CountDownLatch

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.200.74.241]2022年05月27日 17时51分41秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章

web浏览器与网站服务器,web服务器和web浏览器 2019-12-17 00:01:53
mysql截取前几个字符串_mysql 截取字符串 函数 2019-12-17 00:01:54
二分查找向上还是向下取整_二分查找有几种写法?它们的区别是什么? 2019-12-17 00:01:54
supervisor 守护多个进程_supervisor守护进程 2019-12-17 00:01:54
easyui datagrid不是相邻的能合并单元格吗_审计过程中,有哪些能让你心动的Excel技巧?... 2019-12-17 00:01:54
asp命令执行语句】_MSSQL语句执行工具asp版 2019-12-17 00:01:54
x86服务器 虚拟化软件,基于X86PC服务器虚拟化解决方案 2019-12-17 00:01:52
放大镜旋转 css,CSS放大镜(增加缩放级别) 2019-12-17 00:01:52
java码农是否过多,是否有很多类会降低Java的性能? 2019-12-17 00:01:52
ajax检测超时,jquery – 使用AJAX时检查会话超时 2019-12-17 00:01:52
戴尔T330服务器装win8系统,win8系统安装步骤 2019-12-17 00:01:52
华为怎么修改wifi代理服务器,华为(huawei)路由器无线设置方法 2019-12-17 00:01:52
win2008r2hpc无盘服务器配置,机房无盘系统服务器配置 2019-12-17 00:01:53
伯克利计算机信息学院,全美计算机专业TOP20院校|麻省理工学院|康奈尔大学|斯坦福大学|计算机|加州大学伯克利分校|cornell|高校|伊萨卡|计算机专业|伊利诺伊大学香槟分校... 2019-12-17 00:01:50
职高计算机应用专业数据库试卷,中职计算机应用专业数据库应用技术期中试卷201304new.doc... 2019-12-17 00:01:51
初中计算机认识ppt课程教案,初中信息技术教育教案_认识计算机硬件.ppt 2019-12-17 00:01:51
kibana数据导入导出,从kibana导出到csv / excel 2019-12-17 00:01:51
java swing点击文字打开网站,Java Swing;单击按钮后如何显示文本 2019-12-17 00:01:51
mysql 查session,使用PHP SESSION变量存储MySQL查询结果 2019-12-17 00:01:51
jackson json java对象,使用Jackson将Java对象转换为JSON 2019-12-17 00:01:51