package com.bjszt.thread.create;
/*
*
*
* 一个场景,共同的资源
* 生产者消费者模式 信号灯法
* wait():等待,释放锁 sleep 等待,不释放锁
*
* notify()/notifyAll() 唤醒
* */
public class Moive {
private String pic;
/*
* flag T 生产者生产 消费者等待,生产完成后通知消费
*
* flag F 消费者消费 生产者等待 消费完成后通知生产
*/
private boolean flag = true;
public synchronized void play(String pic) {
if (!flag) {// 生产者等待
try {
this.wait();
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
// 生产结束
this.pic = pic;
System.out.println("生产了 "+pic);
// 通知消费
this.notify();
// 生产者停下
this.flag = false;
}
public synchronized void watch() {
if (flag) {// 消费者等待
try {
this.wait();
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
System.out.println("消费了: "+pic);
this.notifyAll();
this.flag = true;
}
}
package com.bjszt.thread.create;
public class Watcher implements Runnable{
private Moive m;
public Watcher(Moive m){
super();
this.m=m;
}
public void run() {
// TODO 自动生成的方法存根
for(int i=0;i<20;++i){
m.watch();
}
}
}
package com.bjszt.thread.create;
public class Player implements Runnable{
private Moive m;
public Player(Moive m){
super();
this.m=m;
}
public void run() {
// TODO 自动生成的方法存根
for(int i=0;i<20;++i){
if(i%2==0){
m.play("左青龙");
//System.out.println("左青龙");
}
else{
m.play("右白虎");
}
}
}
}
package com.bjszt.thread.create;
public class App {
public static void main(String args[]){
Moive m=new Moive();
Player p=new Player(m);
Watcher w=new Watcher(m);
new Thread(p).start();
new Thread(w).start();
}
}