/**
* 一个场景,共同的资源
* 生产者消费者模式信号灯法
* wait()等待,释放锁 sleep 不释放锁
* notify()/notifyAll():唤醒
* 与synchronized一起使用
* @author Administrator
*
*/
public class product_customer {
private String pic;
//信号灯 flag--->T 生产者生产,消费者等待,生产完成后通知消费
// F 消费者消费,生产者等待,消费完成后通知生产
private boolean flag=true;
/**
* 播放
*/
public synchronized void play(String pic){
//生产者生产
if (!flag) {
try {
this.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
//开始生产
try {
Thread.sleep(600);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("生产了 "+pic);
//生产完毕
this.pic=pic;
//通知消费
this.notify();
//生产者停下
this.flag=false;
}
public synchronized void watch(){
//消费者等待
if (flag) {
try {
this.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
//开始消费
try {
Thread.sleep(600);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(" -->消费了 "+pic);
//消费完毕
//通知生产
this.notifyAll();
//停止消费
this.flag=true;
}
}
/**
* 生产者
* @author Administrator
*
*/
public class Player implements Runnable{
product_customer m;
public Player(product_customer m) {
super();
this.m = m;
}
@Override
public void run() {
for(int i=0;i<200;i++){
if (0==i%2) {
m.play("左青龙");
}else {
m.play("右白虎");
}
}
}
}
public class Watcher implements Runnable{
private product_customer m;
public Watcher(product_customer m) {
super();
this.m = m;
}
@Override
public void run() {
for(int i=0;i<200;i++){
m.watch();
}
}
}
public class App {
public static void main(String[] args) {
//共同的资源
product_customer m=new product_customer();
//多线程
Player p=new Player(m);
Watcher w=new Watcher(m);
new Thread(p).start();
new Thread(w).start();
}
}