package learn.java.cn.deadlock;
/**
* 生产者消费者模式信号灯法
* wait()等待 释放锁,sleep()i不释放锁
* @author Steven
*
*/
public class Movie {
private String src;
private boolean flag=true;
//flag=T,生产者生产,消费者等待,生产完成后通知消费
//flag=F,消费者消费,生产者等待,消费完成后通知生产
public synchronized void player(String src ) {
if (!flag) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.src=src;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//通知消费
this.notify();
//生产者停下
flag=false;
}
public synchronized void watcher() {
if (flag)
{
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(src);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.notifyAll();
flag=true;
}
}
package learn.java.cn.deadlock;
public class Palyer implements Runnable{
Movie t=new Movie();//
Palyer(Movie m){
this.t=m;
}
//对象之间赋值,引用 指向同一对象
@Override
public void run() {
// TODO Auto-generated method stub
test();
}
public void test()
{
for(int i=0;i<=20;i++)
{
if(i%2==0)
t.player("王尚权");
else
t.player("小静");
}
}
public static void main(String[] args) {
Movie m=new Movie();
Palyer p=new Palyer(m);
Watcher w=new Watcher(m);
new Thread(p).start();
new Thread(w).start();
}
}
class Watcher implements Runnable {
Movie s=new Movie();
Watcher(Movie m){
this.s=m;
}//对象之间赋值,引用指向同
@Override
public void run() {
// TODO Auto-generated method stub
test2();
}
public void test2()
{for (int i=0;i<=20;i++)
s.watcher();
}
}