生产者和消费者模型:信号灯法
-
信号灯法就是在缓冲区的基础上加个标识符,在召唤你之前给你一个限定条件
-
当物件一般为不可数名词时使用
package com.li.changGe.multithreading.threadCommunication;
public class SignalLightsDemo01 {
public static void main(String[] args) {
TV tv = new TV();
new Player(tv).start();
new Audience(tv).start();
}
}
//演员
class Player extends Thread{
private TV tv;
public Player(TV tv){
this.tv = tv;
}
@Override
public void run() {
for (int i = 0; i <= 10; i++) {
if(i % 2 == 0){
tv.play("快乐大本营");
}else {
tv.play("抖音");
}
}//for
}
}
//观众
class Audience extends Thread{
private TV tv;
public Audience(TV tv){
this.tv = tv;
}
@Override
public void run() {
for (int i = 0; i <= 10; i++) {
tv.watch();
}
}
}
class TV extends Thread{
private boolean flag = true;
private String programme;
public synchronized void play(String name) {
if(!flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("演员表演了"+name);
programme = name;
flag = !flag;
this.notifyAll();
}
public synchronized void watch() {
if(flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("观众看了"+programme);
flag = !flag;
this.notifyAll();
}
}