生产者消费者模式是针对现实情况开发出来的,模拟了多线程的同步机制,
需求:两个线程需要对同一对象进行不同的操作,并且这个过程需要两个线程同时进行
下面我们用蛋糕店举个例子:有一家蛋糕店卖蛋糕,有消费者和生产商两个对象,
消费者负责买蛋糕店的蛋糕,生产商向蛋糕店供应
蛋糕,消费和生产是同时进行的,不能出现供大于求,
或者供不应求的现象。
该模式中用到wait和notify方法:
wait和notify方法不是线程对象的方法,是java中任何一个java对象
都有的方法,因为这两个方式是Object类中自带的。
wait方法和notify方法不是通过线程对象调用,
不是这样的:t.wait(),也不是这样的:t.notify()..不对。
当蛋糕店蛋糕数量囤积达到一定数量时,生产者应停止生产,消费者要消费
当蛋糕店卖完了蛋糕或者卖到蛋糕数量所剩不多时,停止消费(我不卖 了!!!),开始生产。
下面是代码:
import java.sql.Array;
import java.util.ArrayList;
import java.util.List;
public class test {
public static void main(String[] args) {
List cakeShop=new ArrayList();
Producer producer=new Producer(cakeShop);
Consumer consumer=new Consumer(cakeShop);
Thread tp=new Thread(producer,"生产商");
Thread tc=new Thread(consumer,"消费者");
tc.setPriority(1);
tp.setPriority(10);
tp.start();
tc.start();
}
}
//生产者
class Producer implements Runnable{
private List cakeShop;
public List getCakeShop() {
return cakeShop;
}
public void setCakeShop(List cakeShop) {
this.cakeShop = cakeShop;
}
//构造方法,拿到蛋糕店对象
public Producer(List cakeShop) {
this.cakeShop = cakeShop;
}
@Override
public void run() {
//生产者一直生产
while (true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//蛋糕店蛋糕数量>=10个,停止生产,进入等待
synchronized (this.getCakeShop()){
if (cakeShop.size()>=10){
try {
cakeShop.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//程序到这说明蛋糕数量<10,需要生产
cakeShop.add(new Cake());//生产一个蛋糕
System.out.println(Thread.currentThread().getName()+"生产蛋糕,还有----->"+cakeShop.size()+"个蛋糕");
cakeShop.notifyAll();//释放蛋糕店对象锁,好让消费者去消费
}
}
}
}
//消费者
class Consumer implements Runnable{
private List cakeShop;
public List getCakeShop() {
return cakeShop;
}
public void setCakeShop(List cakeShop) {
this.cakeShop = cakeShop;
}
//构造方法,拿到蛋糕店对象
public Consumer(List cakeShop) {
this.cakeShop = cakeShop;
}
@Override
public void run() {
//消费也一直在进行
while (true){
int i=0;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (this.getCakeShop()){
//蛋糕卖完了,停止消费
if (cakeShop.size()==0){
try {
cakeShop.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//程序执行到这说明还有蛋糕,需要卖掉
cakeShop.remove(i);//卖掉下标为0处的蛋糕
i++;
System.out.println(Thread.currentThread().getName()+"买蛋糕,还有----->"+cakeShop.size()+"个蛋糕");
//卖掉蛋糕后要唤醒,释放蛋糕店对象锁
cakeShop.notifyAll();
}
}
}
}
//蛋糕类
class Cake {
String name;
double price;
}