信号灯法控制线程间协作
下图这个例子就是利用信号的法控制线程之间的协作,当flag为true时观众观看节目,当flag为false时演员表演节目。这样就能保证演员表演节目时观众就进行观看,不会出现演员一直表演节或观众一直观看的情况。
public class TestPC2 {
public static void main(String[] args) {
//自创建一个节目,保证同一资源
TV tv = new TV();
//创建演员和观众
Audience audience = new Audience(tv);
Actor actor = new Actor(tv);
//同时开启
audience.start();
actor.start();
}
}
//观众
class Audience extends Thread {
TV tv;
public Audience(TV tv) {
this.tv = tv;
}
@Override
public void run() {
//观看100个节目
for (int i = 0; i < 100; i++) {
tv.watch();
}
}
}
//演员
class Actor extends Thread {
TV tv;
public Actor(TV tv) {
this.tv = tv;
}
@Override
public void run() {
//表演100个节目
for (int i = 0; i < 100; i++) {
//轮流表演
if (i / 2 == 0) {
tv.play("川剧变脸");
} else {
tv.play("皮影");
}
}
}
}
//节目
class TV {
//设置红绿灯,true时通知观众观看,false时通知演员表演
boolean flag = false;
//表演节目
public synchronized void play(String program) {
//判断是否需要表演,false表示需要表演
if (flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//表演节目
System.out.println("表演了" + program);
flag = !this.flag;
//通知观众观看
this.notifyAll();
}
//观看节目
public synchronized void watch() {
//判断是否能够观看,true表示可以观看
if (!flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//观众观看
System.out.println("观众观看了节目");
flag = !this.flag;
//通知演员表演节目
this.notifyAll();
}
}