关于生产者模式和消费者模式

来源:互联网 发布:淘宝店没流量 编辑:程序博客网 时间: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()来控制两个线程

输出结果:



0 0
原创粉丝点击