信号灯法实现多线程通信
信号灯法实现多线程通信
多线程接近尾声了,学习是一方面,练习也很重要
例子:
演员表演节目
观众观看
package com.example.multi_thread;
import lombok.SneakyThrows;
// 信号灯法实现肯德基购餐
public class TestPC2 {
    public static void main(String[] args) {
        Tv tv = new Tv();
        new Thread(new Player(tv)).start();
        new Thread(new Watcher(tv)).start();
    }
}
class Player implements Runnable {
    Tv tv;
    public Player(Tv tv) {
        this.tv = tv;
    }
    @SneakyThrows
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            if (i % 2 == 0) {
                tv.show("脱口秀");
            } else {
                tv.show("吐槽");
            }
        }
    }
}
class Watcher implements Runnable {
    Tv tv;
    public Watcher(Tv tv) {
        this.tv = tv;
    }
    @SneakyThrows
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            tv.watch();
        }
    }
}
class Tv {
    boolean flag = true; // true 生产者生产, 消费者等待 false 生产者等待, 消费者消费
    String voice;
    public synchronized void show(String voice) throws InterruptedException {
        if (!flag) {
            wait();
        }
        this.voice = voice;
        System.out.println("表演了" + voice);
        notifyAll();
        flag = !flag;
    }
    public synchronized void watch() throws InterruptedException {
        if (flag) {
            wait();
        }
        System.out.println("观看了" + voice);
        notifyAll();
        flag = !flag;
    }
}
输出:
表演了脱口秀
观看了脱口秀
表演了吐槽
观看了吐槽
表演了脱口秀
观看了脱口秀
表演了吐槽
观看了吐槽
表演了脱口秀
观看了脱口秀
表演了吐槽
观看了吐槽
表演了脱口秀
观看了脱口秀
表演了吐槽
观看了吐槽
表演了脱口秀
观看了脱口秀
表演了吐槽
观看了吐槽
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号