目的:为了解决线程死锁和线程执行顺序混乱问题。
package com.lifeng.thread.pro;
/**
* 一个场景,共同的资源
* 生成者消费者模式,信号灯
*必须与同步 synchronized一起使用
* wait() 等待释放锁,sleep等待,不释放锁
* notify() 唤醒, notifyAll()
*
*
* @author 51093
*
*/
public class Movie {
private String pic;
private boolean flag=true;
/**
* 生产者消费者模式
* flag:
* 为true:生产者生成,消费者等待,生产完成后通知消费者
* 为false:消费者消费,生产者等待,消费者消费完成后通知生成者
* @param pic
*/
public synchronized void play(String pic) {
if(!flag) {//生产者等待
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//开始生产
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//生产完毕
this.pic=pic;
//通知消费者
this.notify();
//生产者停下
this.flag=false;
}
public synchronized void watch() {
if(flag) {//消费者等待
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//开始消费
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//消费完毕
System.out.println(this.pic);
//通知生产者
this.notify();
this.flag=true;
}
}
package com.lifeng.thread.pro;
public class Play implements Runnable{
private Movie m;
public Play(Movie m) {
super();
this.m = m;
}
@Override
public void run() {
for(int i=0;i<20;i++) {
if(i%2==0) {
m.play("左青龙");
}else {
m.play("右白虎");
}
}
}
}
package com.lifeng.thread.pro;
public class Watch implements Runnable{
private Movie m;
public Watch(Movie m) {
super();
this.m = m;
}
@Override
public void run() {
for(int i=0;i<20;i++) {
m.watch();
}
};
}
package com.lifeng.thread.pro;
public class MovieApp {
public static void main(String[] args) {
Movie m=new Movie();
Play p=new Play(m);
Watch w=new Watch(m);
Thread t1=new Thread(p);
Thread t2=new Thread(w);
t1.start();
t2.start();
}
}