6.21Java多线程并发协作信号灯法

6.21Java多线程并发协作信号灯法

通过标识位在方法当中进行数据操作

package iostudy.threadcooperation;

/**
* 生产者消费者实现方式二:信号灯法
* 借助标识位
* @since JDk 1.8
* @date 2021/6/21
* @author Lucifer
*/
public class CoTestNo2 {
   public static void main(String[] args) {

       /*新建资源类对象*/
       Tv tv = new Tv();

       new Player(tv).start();

       new Watcher(tv).start();
  }
}

/**
* 生产者 演员
*/
class Player extends Thread{

   /*资源类属性*/
   Tv tv;

   /*建立构造器*/
   public Player(Tv tv){
       this.tv = tv;
  }

   /*重写run方法*/
   @Override
   public void run(){

       /*循环说话*/
       for (int i=0; i<20; i++){
           /*加一个奇偶性达到观看不一样的效果*/
           if (i%2==0){
               this.tv.play("JunkingBoy");
          }else {
               this.tv.play("Lucifer!!!");
          }
      }
  }

}

/**
* 消费者 观众
*/
class Watcher extends Thread{

   /*资源类对象*/
   Tv tv;

   /*构造器*/
   public Watcher(Tv tv){
       this.tv = tv;
  }

   /*重写run方法*/
   @Override
   public void run(){

       /*循环添加控制*/
       for (int i=0; i<20; i++){
           tv.watch();
      }

  }
}


/**
* 同一个资源 电视
*/
class Tv{

   /*资源类*/
   String voice;
   //加入信号灯控制
   boolean flag = true;

   //T表示演员表演 观众等待--->一个方法
   public synchronized void play(String voice){

       //演员等待
       if (flag){
           try {
               this.wait();
          }catch (InterruptedException e){
               System.out.println(e.getMessage());
               e.printStackTrace();
          }
      }

       System.out.println("表演了:" + voice);
       this.voice = voice;

       /*唤醒线程*/
       this.notifyAll();

       /*切换开关*/
       this.flag =! this.flag;

  }

   //F表示观众观看 演员等待
   public synchronized void watch(){

       //观众等待
       if (flag){
           /*观众等待判断*/
           try {
               this.wait();
          }catch (InterruptedException e){
               System.out.println(e.getMessage());
               e.printStackTrace();
          }
      }

       System.out.println("听到了:" + voice);

       /*切换标志*/
       this.notifyAll();

  }
}

通过布尔量控制开关--->通过信号灯控制

It's a lonely road!!!
原文地址:https://www.cnblogs.com/JunkingBoy/p/14915368.html