package 线程_181_生产者与消费者模式_信号灯法_练习;
/**
- 解决线程死锁的方法
- 创建一个场景 (共同的资源)
- 生产者消费者模式:信号灯法
- wait(): 等待及释放锁
- sleep():不释放锁
- 唤醒:notify(),一个线程使用
-
notifyAll(),多个线程使用
- 注意: Player方法和Watcher方法必须与Movie方法同步,否则无法等待
-
notify(),notifyAll()与synchronized一起使用
*/
public class Movie {//Movie电影
//属性
private String pic;//pic影片
//加入标识(信号灯);flag–>为true表示生产者生产,消费者等待;生产完成后通知消费者
//相反flag–>为false时消费者生产,生产者等待;消费完成后通知生产者
private boolean flag = true;//flag标识;设置默认为true
//播放
public synchronized void play(String pic){//play播放,扮演;加入锁定synchronized
if(!flag){//生产者等待
try {
this.wait();//
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//开始生产
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
//输出
System.out.println(“生产了:”+pic);
//生产完毕
this.pic = pic;
//通知消费者
this.notify();
//生产者停止
this.flag = false;
}
//获取
public synchronized void watch(){//watch观看;加入锁定synchronized
if(flag){//消费者等待
try {
this.wait();//
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//开始消费
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
//消费完毕
System.out.println(“消费了:”+pic);
System.out.println("-------------------");
//通知生产者
this.notifyAll();//因为这里只有一个线程也可以使用notify():一个线程用notify();多个线程使用notifyAll()
//消费者停止
this.flag = true;
}
}
//--------------------------------------------------------
package 线程_181_生产者与消费者模式_信号灯法_练习;
/**
- 创建线程:1.生产者
*/
public class Player implements Runnable {//Player表演者;Runnable可运行的
private Movie m ;//共同资源Movie
public Player(Movie m) {
super();
this.m = m;
}
@Override
public void run() {
for(int i=0;i<10;i++){
m.watch();
}
}
}
//-------------------------------------------------
package 线程_181_生产者与消费者模式_信号灯法_练习;
/**
-
创建线程:2.消费者
*/
public class Watcher implements Runnable {//Watcher观察者(消费者)
private Movie m ;//共同资源Moviepublic Watcher(Movie m) {
super();
this.m = m;
}
@Override
public void run() {
//
for(int i=0;i<10;i++){
if(0==i%2){//分配线程出现次数
m.play(“大家都在学”);
}else{
m.play(“java”);
}
}
}
}
//-----------------------------------------------
package 线程_181_生产者与消费者模式_信号灯法_练习;
/** -
应用
*/
public class App {public static void main(String[] args) {
//共同的资源
Movie m = new Movie();
//创建多线程对同一资源的访问
Player p = new Player(m);
Watcher w = new Watcher(m);
//代理
new Thread§.start();
new Thread(w).start();
}
}
//结果---------------------------------------
生产了:大家都在学
消费了:大家都在学