本文共 2188 字,大约阅读时间需要 7 分钟。
上面博客采用缓存区方式实现了生产者与消费者
这篇介绍下生产者消费者模型的信号灯法,根据不停场景使用不同方式。
信号灯法:利用标识控制线程等待和唤醒,类似于信号灯,红灯性绿灯停。举例:
站在司机的角度:红灯停,人走。 绿灯走,人停。 对象分析: 车 、 人 、 信号灯 车: 就是来车行走。 人:就是来人行走。 信号灯: 绿灯时车走行走,变灯通知人行走。 红灯时人行走,变灯通知车行走实现:
// 信号灯 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(); }
结果:
完美结束!转载地址:http://vjhof.baihongyu.com/