关于生产者模式和消费者模式
来源:互联网 发布:淘宝店没流量 编辑:程序博客网 时间:2024/05/21 19:25
在java多线程中,有个生产者和消费者模式,这是多线程中很有意思的一个模式,所以写下自己的心得和大家共赏下
生产者消费者问题也是一个典型的线程问题,我们举一个这方面的实例来说明:在一个果园里,有农民和小孩子,农夫会不停的摘水果放入一个篮子里直到水果筐子满了,而小孩子会不停的从水果筐里边拿来水果吃,直到把水果吃完。分析这个模型我们可以看出:农夫可以看成是一个生产者的线程,小孩子可以看成是一个消费者的线程,而水果筐是共享资源。
问题:如果生产速度大于消费速度 消费速度大于生产速度 会怎样?
。因此,一般情况下,当水果筐满时,会让生产者交出水果筐的占用权,并进入等待状态。然后等待消费者吃了水果,然后消费者通知生产者水果筐有空间了。同样地,当水果筐空时,消费者也必须等待,等待生产者通知它水果筐中有水果了。这种互相通信的过程就是线程间的通信。
怎样解决呢?wait和notify方法
。
代码如下:
首先要建立三个类:农夫类(NongFu),小孩子类(Child),框子类(Kuang)
农夫类:
public class NongFu extends Thread {
public void run() {
while (true) {//用来保证一直循环
synchronized (Kuang.kuang) {//进程加锁
if (Kuang.kuang.size() == 30) {//假定筐子里最多有30个水果,判断框子里是否还有30个水果
try {
Kuang.kuang.wait();//进程等待
} catch (InterruptedException e) {//处理异常
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
Kuang.kuang.add("1");//增加苹果
Kuang.kuang.notify();//唤醒线程
System.out.println("农夫放了一个");//输出采摘个数
System.out.println(this.getName() + "框里有---"
+ Kuang.kuang.size() + "--个水果");
try {
this.sleep(500);//用来使线程随机性增大
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
小孩子类:
public void run() {
while (true) {
synchronized (Kuang.kuang) {
if (Kuang.kuang.size() == 0) {//判断框里苹果个数
try {
Kuang.kuang.wait();//线程等待
} catch (InterruptedException e) {//处理异常
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
Kuang.kuang.remove("1");//吃苹果
Kuang.kuang.notify();
System.out.println("小孩吃掉了一个");//输出剩余苹果
System.out.println(this.getName() + "----还剩下"
+ Kuang.kuang.size() + "个水果");
try {
this.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
筐子类:
import java.util.ArrayList;
import java.util.List;
public class Kuang {
// TODO Auto-generated method stub
public static List<String> kuang=new ArrayList<>();//用一个集合来存储苹果
}
测试:
public static void main(String[] args) {
// TODO Auto-generated method stub
NongFu nf=new NongFu();
Child cd=new Child();
nf.start();
cd.start();
}
通过这个代码可以测试出生产者消费者模式:一边摘苹果一边吃苹果,但是两个线程相互独立,通过notify()和wait()来控制两个线程
输出结果:
- 关于生产者模式和消费者模式
- 生产者和消费者模式
- 生产者和消费者模式
- 生产者和消费者模式
- 生产者和消费者模式
- synchronize和生产者消费者模式
- 生产者—消费者模式
- 生产者-消费者模式
- 消费者与生产者模式
- 消费者与生产者模式
- 消费者与生产者模式
- 生产者消费者模式浅析
- 生产者消费者模式
- 生产者/消费者模式
- 生产者/消费者模式
- 生产者-消费者模式
- 【转】生产者消费者模式
- 生产者、消费者模式
- 抗锯齿
- MinGW官方安装法
- 安装yarn下的spark过程记录以及sparkr安装记录
- 矩阵快速幂求斐波拉契数列的第n项
- Nginx 作为web server 的优化要点
- 关于生产者模式和消费者模式
- 数据库事务隔离级别
- 24.从公众号筹集10万股份学到的商业化思维
- spark:学习杂记+如何求丢失的数据例子--25
- 李白喝酒问题
- Android开发——Intent(2)
- 黑马程序员——C语言基础篇---指针
- 自定义封装简单的基于FMDB以及数据model的数据库操作
- mongoDB笔记2-shell Database对象