javase之通过生产者消费者模式解决死锁
package com.ljl.thread;
/**
* 一个场景,共同的资源
* 生成者消费者模式--信号灯法
* @author Richard
* wait() :等待,释放锁
* sleep() :等待,不释放锁
* notify()/notifyAll() :唤醒 与synchronized一起使用
*
*/
public class Movie {
private String pic;
//信号灯
//flag为true,生产者生产,消费者等待,生产完成后通知消费
//flag为false,生产者等待,消费者消费,消消费完成后通知生产
private boolean flag=true;
/**
* 播放
* @param pic
*/
public synchronized void play(String pic) {
if(!flag) {//生产者等待
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//开始生产
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("生产了"+pic);
//生产完毕
this.pic=pic;
//通知消费
this.notify();
//生产者停下
this.flag=false;
this.pic=pic;
}
public synchronized void watch() {
if(flag) {//消费者等待
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//开始消费
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("消费了"+pic);
//消费完毕
//通知生产
this.notifyAll();
//消费停止
this.flag=true;
System.out.println(pic);
}
}
package com.ljl.thread;
/**
* 一个线程,访问这资源电影(生产者)
* @author Richard
*
*/
public class Player implements Runnable{
private Movie m;
public Player(Movie m) {
super();
this.m = m;
}
@Override
public void run() {
for(int i=0;i<20;i++) {
if(0==i%2) {
m.play("龙哥");
}else {
m.play("敏姐");
}
}
}
}
package com.ljl.thread;
/**
* 一个线程,访问这资源电影(消费者)
* @author Richard
*
*/
public class Watcher implements Runnable {
private Movie m;
public Watcher(Movie m) {
super();
this.m = m;
}
@Override
public void run() {
for(int i=0;i<20;i++) {
m.watch();
}
}
}
package com.ljl.thread;
public class App {
public static void main(String[] args) {
//共同资源
Movie movie=new Movie();
//多线程
Player player=new Player(movie);
Watcher watcher=new Watcher(movie);
new Thread(player).start();
new Thread(watcher).start();
}
}