java线程通讯-生产者消费者模型(信号灯法)

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();
    }

结果:
在这里插入图片描述
完美结束!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Survivor001

你可以相信我,如果你愿意的话

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值