本文共 2022 字,大约阅读时间需要 6 分钟。
public class TestPC2 { public static void main(String[] args) { TV tv = new TV(); new Player(tv).start(); new Watcher(tv).start(); }}// 生产者:演员class Player extends Thread { TV tv; public Player(TV tv) { this.tv = tv; } @Override public void run() { for (int i = 0; i < 20; i++) { if (i % 2 == 0) { this.tv.play("快乐大本营播放中"); } else { this.tv.play("抖音:记录美好生活"); } } }}// 消费者:观众class Watcher extends Thread { TV tv; public Watcher(TV tv) { this.tv = tv; } @Override public void run() { for (int i = 0; i < 20; i++) { this.tv.watch(); } }}// 产品:节目class TV { // 演员表演,观众等待 // 观众观看,演员等待 String voice; Boolean flag = true; // 表演 public synchronized void play(String voice) { if (!flag) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("演员表演了:" + voice); // 通知观众观看 this.notifyAll(); this.voice = voice; this.flag = !this.flag; } // 观看 public synchronized void watch() { if (flag) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("观看了:" + voice); // 通知演员表演 this.notifyAll(); this.flag = !this.flag; }} 通过上述代码可以观察到,生产者(Player)和消费者(Watcher)通过TV类的方法进行交替操作。生产者周期性地调用play方法,切换播放不同的节目内容,而消费者则通过watch方法进行观看。当play方法被调用时,会检查当前的flag状态。如果flag为false,表示当前处于等待状态,生产者会等待消费者的通知(通过notifyAll)唤醒。唤醒后,生产者执行表演并切换flag状态,通知所有等待的消费者进行观看。
消费者在watch方法中同样会检查flag状态。如果flag为true,表示当前可以开始观看,消费者会等待生产者的通知(通过notifyAll)唤醒。唤醒后,消费者执行观看操作并切换flag状态,通知所有等待的生产者继续表演。
这种设计类似于信号灯模型,通过标识符(flag)和等待/通知机制,实现了生产者与消费者之间的交替操作,确保了资源的公平共享和高效利用。
转载地址:http://useq.baihongyu.com/