java线程通讯-生产者消费者模型(信号灯法)
上面博客采用缓存区方式实现了生产者与消费者https://blog.csdn.net/qq_31142237/article/details/115285293
这篇介绍下生产者消费者模型的信号灯法,根据不停场景使用不同方式。
信号灯法:利用标识控制线程等待和唤醒,类似于信号灯,红灯性绿灯停。
举例:
站在司机的角度:红灯停,人走。 绿灯走,人停。
对象分析: 车 、 人 、 信号灯
车: 就是来车行走。
人:就是来人行走。
信号灯: 绿灯时车走行走,变灯通知人行走。 红灯时人行走,变灯通知车行走
实现:
// 信号灯
static class Signallamp{
boolean flag = true; // 绿灯
// 绿灯: 车走,人停
public synchronized void CarGO(){
// 不是绿灯,则停止等到人走
if(!flag){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 否则车走了,变成红灯,通只人行走
System.out.println(Thread.currentThread().getName()+":现在是"+flag+"灯:车子行驶中");
System.out.println("变灯了");
flag = !flag;
notify();
}
// 红灯: 车停了,人走
public synchronized void ManGO(){
// 绿灯,则车走(司机角度是绿灯,自己角度真实应该是红灯)
if(flag){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 否则人走了,变成绿灯,通知车走
System.out.println(Thread.currentThread().getName()+":现在是"+flag+"灯:人在走路");
System.out.println("变灯了");
flag = !flag;
notify();
}
}
// 车
static class Car implements Runnable{
Signallamp signallamp;
public Car(Signallamp signallamp){
this.signallamp = signallamp;
}
// 车在行走
public void run() {
for (int i = 0; i <20 ; i++) {
signallamp.CarGO();
}
}
}
// 人
static class Man implements Runnable{
Signallamp signallamp;
public Man(Signallamp signallamp){
this.signallamp = signallamp;
}
// 人在行走
public void run() {
for (int i = 0; i <20 ; i++) {
signallamp.ManGO();
}
}
}
public static void main(String[] args) {
Signallamp signallamp = new Signallamp();
new Thread(new Car(signallamp)).start();
new Thread(new Man(signallamp)).start();
}
结果:
完美结束!