zoukankan      html  css  js  c++  java
  • 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!!!
  • 相关阅读:
    Beta冲刺——day2
    Beta冲刺——day1
    OpenGL立方体在世界坐标系中_缩放_旋转_平移_顶点片源着色器_光照作用_棋盘纹理贴图
    FIRST集和FOLLOW集
    现代计算机接口实验 (五)0809实验
    现代计算机接口实验 (四)0832实验
    现代计算机接口实验 (二)8253实验
    现代计算机接口实验 (三)8255实验
    现代计算机接口实验 (一)熟悉环境
    可编程控制器实训
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/14915368.html
Copyright © 2011-2022 走看看