/** * 一个场景,共同的资源 * 生产者与消费者模式 信号灯法 * 解决多线程防止死锁的方法 */ public class ProducerAndConsumerModels { 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(); } }
/** * 一个场景,共同的资源 * 生产者与消费者模式 信号灯法 * wait():等待,释放锁 sleep():不释放锁 * notify() / motyfyAll():唤醒 * @author 彼岸夜微凉 */ public class Movie { private String m_pic; //信号灯 //flag --> T 生产者生产,消费者等待,生产完后通知消费 //flag --> F 消费者消费,生产者等待,消费完后通知生产 private boolean flag = true; 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(); } //生产完毕 this.m_pic = pic; //通知消费 this.notify(); //生产者停下 this.flag = false; } 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(m_pic); //通知生产 this.notify(); //消费停止 this.flag = true; } }
/** * 生产者 */ public class Player implements Runnable { private Movie m_movie; public Player(Movie movie){ m_movie = movie; } @Override public void run() { for(int i=0;i <20; i ++){ if(i % 2 == 0){ m_movie.play("左青龙"); }else { m_movie.play("右白虎"); } } } }
/** * 消费者 */ public class Watcher implements Runnable { private Movie m_movie; public Watcher(Movie movie){ m_movie = movie; } @Override public void run() { for(int i = 0;i < 20;i ++){ m_movie.watch(); } } }