-
java入门之基于AQS自己实现一个同步器(2)
final static Condition full = lock.newCondition();
// 当队列queue是空的,其余的消费线程就丢到这个条件队列里面
final static Condition empty = lock.newCondition();
// 队列queue中存字符串最多只能是3个
final static int queue_MAX_SIZE = 3;
//往队列queue中压入字符串
public static void add() {
lock.lock();
try {
// 当队列满了,就将其他生产线程丢进full的条件队列中
while (queue.size() == queue_MAX_SIZE) {
full.await();
}
System.out.println("prd:" + "hello");
// 往队列queue中添加字符串
queue.add("hello");
// 生产成功,唤醒消费条件队列中的所有线程赶紧去消费
empty.signalAll();
} catch (Exception e) {
//
} finally {
lock.unlock();
}
}
//从队列queue弹出字符串
public static void poll() {
lock.lock();
try {
// 当队列queue中一个字符串都没有,就将剩下的消费线程丢进enpty对应的队列中
while (queue.size() == 0) {
empty.await();
}
// 消费队列queue中的字符串
String poll = queue.poll();
System.out.println("consumer:" + poll);
// 消费成功,就唤醒full中所有的生产线程去生产字符串
full.signalAll();
} catch (Exception e) {
//
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
// 生产者线程
for (int i = 0; i < 5; i++) {
new Thread(() -> {
add();
}).start();
}
// 消费者线程
for (int i = 0; i < 5; i++) {
new Thread(() -> {
poll();
}).start();
}
}
}
可以看到队列中最多只能是3个字符串,最后都能被消费完毕!
栏目列表
最新更新
Dapper 一对多查询 one to many
非标设备多相机流水线模式缓存图片
RestTemplate + okhttp 实现远程调用
SpringCloud入门学习
从实战角度超级详解中大型企业微服务化
从实战角度超级详解中大型企业微服务化
Java 添加、读取、删除Excel图片
spring cloud微服务快速教程之(七) Sprin
spring cloud微服务快速教程之(八) Sprin
rabbitmq在kubernetes中持久化集群部署
Linux PXE + Kickstart 自动装机
Shell 编程 基础
Shell 编程 条件语句
CentOS8-网卡配置及详解
Linux中LVM逻辑卷管理
1.数码相框-相框框架分析(1)
Ubuntu armhf 版本国内源
Linux中raid磁盘阵列
搭建简易网站
Linux-常用命令
SQL SERVER查询数据库所有表的大小,按照记
使用 SQL 服务器时,"评估期已过期"错
sql server无法连接本地服务器
使用sql语句创建表
VB操作Access数据库小记 ————————
access数据库远程连接
java web操作Access数据库
数据库学习总结(1)
二级Access数据库大纲知识要点
链接表的意义