JavaThread 15 线程协作 → 信号灯法

6.3 线程协作 → 信号灯法


  • 管程法(多个线程 共同处理多种类型数据,大量数据的线程协作方法)
  • 信号灯法(多个线程 共同处理单一数据的线程协作方法)

6.3.1 信号灯法理解

将数据缓冲区 替换成了 单一数据 类,之前是 创建一个数据结构体,然后 创建一个 该数据类型的 缓冲容器 放在 数据缓冲区里,这样数据缓冲区 就可以 实现多种数据的处理 和 大量数据的 混合处理!

  • 信号灯法:是从 管程法 其中的 判断 条件中特别抽出来的 一种方法。 因为 我们 的管程法 无论处理什么数据 都需要 进行 一下 判断!来确认 自己是否 进入 wait() 或 notify() 唤醒状态! 那么在我们 处理单一数据的时候,就可以 设定 一个 布尔值的 flag 标识符 来进行 单一数据处理的 判断!(就这样信号灯法 诞生了!)

  • 演员表演与观众观看问题

package www.muquanyu.Seniorpart;

//其实就是 标志位,常常指 针对单个数据的处理
public class 信号灯法 {
    public static void main(String[] args) {
        TV tv = new TV();

        new Thread(new Player(tv)).start();
        new Thread(new Warcher(tv)).start();
    }
}

//生产者-->演员
class Player implements Runnable{
    TV tv;
    public Player(TV tv)
    {
        this.tv = tv;
    }
    @Override
    public void run() {
        for(int i = 0;i < 20;++i)
        {
            if(i%2 == 0)
            {
                try {
                    this.tv.play("快乐大本营");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            else{
                try {
                    this.tv.play("抖音:记录美好生活");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}


//消费者-->观众
class Warcher implements Runnable{
    TV tv;
    public Warcher(TV tv)
    {
        this.tv = tv;
    }
    @Override
    public void run() {
        for(int i = 0;i < 20;++i)
        {
            try {
                tv.watch();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}


//产品-->节目
class TV{
    //演员表演的时候 观众等待
    //观众观看的时候 演员等待
    String show;//表演的节目
    //true 为开始表演 false 为未开始表演
    boolean flag = true;

    //表演
    public synchronized void play(String show) throws InterruptedException {
        if(!flag)
        {
            //未开始表演的时候,我们演员就需要等待上演
            //观众什么时候 让他们表演 他们才能上演
           this.wait();
        }
        System.out.println("演员开始表演:"+show);
        //通知观众观看
        this.show = show;
        this.flag = !this.flag;
        //通知唤醒
        this.notifyAll();
    }

    //观看
    public synchronized void watch() throws InterruptedException {
        if(flag)
        {
            //flag = true 则为开始表演
            this.wait();//表演开始的话,就需要 观看
            //观看就需要 等待演员表演完
        }
        //如果没开始表演
        System.out.println("开始观看:"+show);
        //通知演员表演
        this.notifyAll();
        this.flag = !this.flag;
    }
}
  • 输出结果

演员开始表演:快乐大本营
开始观看:快乐大本营
演员开始表演:抖音:记录美好生活
开始观看:抖音:记录美好生活
演员开始表演:快乐大本营
开始观看:快乐大本营
演员开始表演:抖音:记录美好生活
开始观看:抖音:记录美好生活
演员开始表演:快乐大本营
开始观看:快乐大本营
演员开始表演:抖音:记录美好生活
开始观看:抖音:记录美好生活
演员开始表演:快乐大本营
开始观看:快乐大本营
演员开始表演:抖音:记录美好生活
开始观看:抖音:记录美好生活
演员开始表演:快乐大本营
开始观看:快乐大本营
演员开始表演:抖音:记录美好生活
开始观看:抖音:记录美好生活
演员开始表演:快乐大本营
开始观看:快乐大本营
演员开始表演:抖音:记录美好生活
开始观看:抖音:记录美好生活
演员开始表演:快乐大本营
开始观看:快乐大本营
演员开始表演:抖音:记录美好生活
开始观看:抖音:记录美好生活
演员开始表演:快乐大本营
开始观看:快乐大本营
演员开始表演:抖音:记录美好生活
开始观看:抖音:记录美好生活
演员开始表演:快乐大本营
开始观看:快乐大本营
演员开始表演:抖音:记录美好生活
开始观看:抖音:记录美好生活
演员开始表演:快乐大本营
开始观看:快乐大本营
演员开始表演:抖音:记录美好生活
开始观看:抖音:记录美好生活

切记:信号灯法 只适用于 多个线程 对单一数据的 处理!(信号灯法 是 管程法 的子集)

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值