• 生产者、消费者问题之闹钟


    需求:写一个闹钟程序,闹钟每隔2秒响一次,每次响5声,闹钟响铃后1秒,人将闹钟关闭.
    public class People implements Runnable {
      private String name;
      private Clock c;

      public People(String name, Clock c) {
      this.name = name;
        this.c = c;
      }

      public void run() {
        weakup();
      }

      public void weakup() {
        //睡觉的人时刻等待闹铃响
        while(true) {
          synchronized(c) {
            if(c.isRing()) {
              c.setRing(false);
              System.out.println("就起来了就起来");
              try {
                Thread.sleep(1000);
              } catch (InterruptedException e1) {
                e1.printStackTrace();
              }
              c.notify();
              try {
                c.wait();
              } catch (InterruptedException e) {
                e.printStackTrace();
              }
            }else {
              c.setRing(true);
              c.notify();
              try {
                c.wait();
              } catch (InterruptedException e) {
                e.printStackTrace();
              }
            }
          }
        }
      }

      public String getName() {
        return name;
      }

      public void setName(String name) {
        this.name = name;
      }

      public Clock1 getC() {
        return c;
      }

      public void setC(Clock1 c) {
        this.c = c;
      }
    }

    public class Clock implements Runnable {
      private boolean isRing; //判断闹铃是否响过

      public void run() {
        ring();
      }

      public void ring() {
        //闹铃响5次,每次响3声
        for(int i = 0; i < 5; i++) {
          synchronized(this) {
          if(!isRing) {
            isRing = true;
            for(int j = 0; j < 3; j++) {
              System.out.println("叮叮叮...");
            }
            try {
              Thread.sleep(2000);
            } catch (InterruptedException e1) {
              e1.printStackTrace();
            }
            this.notify();
            try {
              this.wait();
            } catch (InterruptedException e) {
              e.printStackTrace();
            }
           }else {
            try {
              isRing = false;
              this.notify();
              this.wait();
            } catch (InterruptedException e) {
              e.printStackTrace();
            }
          }
        }
      }

      public boolean isRing() {
        return isRing;
      }

      public void setRing(boolean isRing) {
        this.isRing = isRing;
      }
    }

    public class TestClockPeople {
      public static void main(String [] args) {
        Clock c = new Clock1();
        People p = new People("大姚", c);

        Thread ct = new Thread(c);
        Thread pt = new Thread(p);

        pt.setDaemon(true); //将人设置为守护线程
        ct.start();
        pt.start();
      }
    }

  • 相关阅读:
    jumpserver的安装
    安装iostat 命令
    zabbix配置server,proxy,agent架构
    RGB颜色对照表
    【ZYNQ-7000开发之九】使用VDMA在PL和PS之间传输视频流数据
    基于AXI VDMA的图像采集系统
    图像采集调试总结
    DDR3调试总结
    内存系列二:深入理解硬件原理
    在嵌入式设计中使用MicroBlaze(Vivado版本)
  • 原文地址:https://www.cnblogs.com/helloworldlx/p/8550356.html
Copyright © 2020-2023  润新知