码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2021-06-22 17:36:56      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:luci   信号灯   and   重写   mod   资源   ice   lse   方法   

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();
?
  }
}

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

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

标签:luci   信号灯   and   重写   mod   资源   ice   lse   方法   

原文地址:https://www.cnblogs.com/JunkingBoy/p/14915368.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!