java多线程之生产者消费者模型
2024-10-07 00:25:58
public class ThreadCommunication{
public static void main(String[] args) { Queue q = new Queue();//创建,并初始化一个队列 Thread p1 = new Thread(new Product(q));
Thread c1 = new Thread(new Consumer(q)); c1.start();
p1.start();
}
} class Product implements Runnable { Queue q ; //声明队列
public Product(Queue q) {
this.q = q;
} public void run() {
for(int i=1; i<5;i++){
q.put(i);
}
}
}
class Consumer implements Runnable { Queue q ; //声明队列
public Consumer(Queue q) {
this.q = q;
} public void run() {
while(true){
q.get();//循环消费,每次消费了一个元素
}
}
} class Queue {
int value = 0;
boolean isEmpty = true;
//生产方法
public synchronized void put(int v){
if(!isEmpty){
System.out.println("共享数据没有被消费,生产者等待...");
try {
wait();//进入等待状态
} catch (InterruptedException e) {
e.printStackTrace();
}
}
value += v;
isEmpty = false; //不为空了
System.out.println("生产者产品数量:"+value);
notify();//通知消费者
}
//消费方法
public synchronized int get(){ if(isEmpty){
try {
System.out.println("共享数据为空,消费者等待...");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
value--;
if(value < 1){
isEmpty = true;
}
System.out.println("消费者消费了一个,剩余:"+value);
notify();
return value;//返回剩余的产品总数
}
}
运行结果:
最新文章
- SpringRMI解析2-RmiServiceExporter逻辑脉络
- linux ckconfig
- SQL Server中,Numric,Decimal,Money三种字段类型的区别
- hdu 1879 继续畅通工程 解题报告
- JAVA基础知识之JVM-——反射和泛型
- SVN提交错误:working copy is not up-to-date解决方法
- 当rsync遇到非默认端口的ssh
- Rikka with Chess(规律)
- launchMode传递参数注意startActivityForResult
- 利用JavaScript实现动态显示表格且对应改变按键的value值
- fiddler抓手机报文的配置指南
- [extjs5学习笔记]第三十七节 Extjs6预览版都有神马新东西
- Oracle闪回表
- mybatis 开发规范
- python小程序打包
- [Tom and Bag][需要记录过程的dp]
- position:fixed固定定位的用法
- [转帖]龙芯下一代处理器微结构GS464E细节曝光
- java踩坑
- 关于 Thread.currentThread()