package Tread; /** * 生产者消费者模式:信号灯法 * wait():等待,释放锁; * notify(); * wait和notify必须和sychronized一同使用; * sleep():抱着锁睡觉: * */ public class Movie { private String pic; private boolean flag = true; // 信号灯 // flag=T:生产生产,消费者等待,生产完成后通知消费: // flag=F:消费者消费,生产者等待,消费完成后通知生产; public Movie(String pic) { super(); this.pic = pic; } public Movie() { } /** * 播放功能 * * @throws InterruptedException */ 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; System.out.println("生产了" + 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(); } this.notify(); this.flag = true; System.out.println("消费了" + pic); } } package Tread; public class Player implements Runnable { private Movie m; @Override public void run() { for (int i = 0; i < 20; i++) { if (0 == i % 2) { m.play("左青龙"); } else { m.play("右白虎"); } } } public Player(Movie movie) { super(); this.m = movie; } } package Tread; public class Watcher implements Runnable { private Movie m; @Override public void run() { for (int i = 0; i < 20; i++) { m.watch(); } } public Watcher(Movie movie) { super(); this.m = movie; } } package Tread; 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(p).start(); new Thread(w).start(); } }
其中Movie是公共资源;