多线程模拟生产者消费者示例之wait/notify
2024-09-06 00:33:40
public class Test { public static void main(String[] args) throws InterruptedException {
List<String> queue = new ArrayList<>();
new Thread(new PThread(queue)).start();
new Thread(new CThread(queue)).start();
}
} /**
* 生产者
*/
class PThread implements Runnable {
private List<String> queue;
private AtomicInteger i = new AtomicInteger(); public PThread(List<String> queue) {
this.queue = queue;
} @Override
public void run() {
while (true) {
synchronized(queue){
//如果queue有元素,那么就释放锁吧
if (queue.size() == 1) {
try {
queue.wait();// 释放锁
} catch (InterruptedException e) {
e.printStackTrace();
}
} else { //没有元素就生产一个元素
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String data = i.getAndIncrement() + "";
queue.add(data);
System.out.println("生产者线程,生产一个元素:"+data);
queue.notify(); //唤醒本线程,就可以获取锁了
}
}
}
}
} /**
* 消费者
*/
class CThread implements Runnable {
private List<String> queue; public CThread(List<String> queue) {
this.queue = queue;
} @Override
public void run() {
while (true) {
synchronized (queue) {
//如果queue中没有元素,就释放锁,让生产者去生产
if (queue.size() == 0) {
try {
queue.wait(); //就释放锁
} catch (InterruptedException e) {
e.printStackTrace();
}
} else { //消费元素
String data = queue.remove(0);
System.out.println("消费者线程,消费一个元素:"+data);
queue.notify();
}
}
}
}
}
最新文章
- Xcode常用技巧(1)-使用Xcode进行代码分析及GDB调试
- 怎样在 Ubuntu 中修改默认程序
- 在Linux下安装C/C++开发工具包的最佳方式
- MyBatis的学习总结三:优化MyBatis配置文件中的配置
- Labview中引用,属性节点,局部变量之间的区别
- [置顶] Asp.Net底层原理(二、写自己的Asp.Net框架)
- 使用python之环境管理
- 每日一练ACM 2019.0422
- Codeforces Round #517 (Div. 2)
- Actor模型和CSP模型的区别
- BOM嵌套简单写法
- 《spring boot 实战》读书笔记
- WDA基础一:激活相关服务
- WPF 中动态改变控件模板
- MVC的使用
- ReportViewer 安装
- HelloWorld 之JasperReports初步
- -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】
- ubuntu中mysql版本升级到5.7
- linux文件系统命令和分区 挂载