当前位置: 代码迷 >> 综合 >> JavaThread 15 线程协作 → 信号灯法
  详细解决方案

JavaThread 15 线程协作 → 信号灯法

热度:54   发布时间:2023-11-24 13:46:56.0

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;}@Overridepublic 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;}@Overridepublic 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;}
}
  • 输出结果

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

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

在这里插入图片描述