需求:写一个闹钟程序,闹钟每隔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();
  }
}

转载于:https://www.cnblogs.com/helloworldlx/p/8550356.html

生产者、消费者问题之闹钟相关推荐

  1. RabbitMQ 入门系列(3)— 生产者消费者 Python 代码实现

    生产者消费者代码示例 上一章节中对消息通信概念做了详细的说明,本章节我们对 RabbitMQ 生产者和消费者代码分别做一示例说明. 1. 生产者代码 #!/usr/bin/env python # c ...

  2. 【C++】多线程(链式、循环队列)实现生产者消费者模式

    生产者消费者模式:         生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同 ...

  3. 面试官让我手写一个生产者消费者模式?

    不知道你是否遇到过面试官让你手写生产者消费者代码.别说,前段时间有小伙伴还真的遇到了这种情况,当时是一脸懵逼. 但是,俗话说,从哪里跌倒就要从哪里爬起来.既然这次被问到了,那就回去好好研究一下,争取下 ...

  4. windows进程生产者消费者代码c语言,生产者消费者问题---C语言实现

    生产者消费者问题(Producer-consumer problem) 是一个多线程同步问题的经典案例. 生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程.与此同时,消费者也在缓冲区消耗 ...

  5. 基于队列的生产消费设计java_生产者-消费者设计模式

    一.生产者消费者设计模式 1.中间队列 一段内存空间,且可存取: 2.两种角色 (1)生产者:生产数据: (2)消费者:消费数据. 3.三种关系 (1)生产者与生产者的互斥关系: (2)消费者与消费者 ...

  6. 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来

    题目要求: 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来.(这是一道百度面试的算 ...

  7. 生产者/消费者模型详解(基于Java)

    title: 生产者消费者模型 tags: 多线程 synchronized 锁 wait() notify() 生产者/消费者模型原理以及代码实现 一.生产者/消费者模型原理 所谓的生产者消费者模型 ...

  8. java线程模拟生产者消费者问题

    所谓的生产者消费者问题,就是存在生产者和消费者两个线程,当仓库还没满的时候,生产者可以生产,当仓库没空的时候,消费者可以取走商品. 我们用实例说话: 下面,我们创建几个类: 1.消费者--主要负责消费 ...

  9. 图文并茂的生产者消费者应用实例demo

    前面的几篇文章<<.NET 中的阻塞队列BlockingCollection的正确打开方式>><<项目开发中应用如何并发处理的一二事>>从代码以及理论角 ...

  10. linux使用线程实现生产者消费者问题,Linux平台下线程同步,实现“生产者消费者问题”...

    (1)线程同步,实现"生产者消费者问题" 要求:缓冲区大小为20,生产者每次放一个产品,消费者每次取走一个产品:生产者和消费者至少2个. (2)代码如下: #include #in ...

最新文章

  1. MQTT的学习研究(五) MQTT moquette 的 Blocking API 发布消息服务端使用
  2. 博士毕业后,去哪儿?
  3. css元素捕捉,css元素选择器
  4. HDU 5306 Gorgeous Sequence
  5. 今天抽点时间来说一个C#里的关键字及它们的原型
  6. php 将date转换成string,php如何实现date转string
  7. 独立成分分析ICA系列5:信息极大化的 ICA 算法
  8. javascript和var之间的区别?
  9. linux怎么抓sip包,Ubuntu下使用Wireshark进行抓包分析(含SIP和RTP包)
  10. Spring Boot2 整合 MyBatis 多数据源
  11. PDF 补丁丁 0.4.1.688 测试版发布(请务必用其替换 682 测试版)
  12. python爬虫抖音音浪_【Python爬虫】抖音去水印
  13. idea没有错误提示的解决方法(一直处于错误分析中)
  14. 解决Excel文件读取遇到值为null单元格会自动跳过的情况
  15. python学习第25天
  16. 《构建之法》 第5.5 第6 第7章
  17. 【Neo4j】第 1 章:图数据库
  18. 如何查看服务器资源占用情况,云服务器如何查看内存占用情况
  19. “九把锁”还是春秋时期的黄金密道
  20. 浅析C#UDP传输大文件

热门文章

  1. 二分查找算法(递归与非递归两种方式)
  2. 【转载】不要一辈子靠技术生存
  3. 获取数据库中的所有表
  4. 必须要熬夜的时候的最佳伴侣是什么?亲测有效
  5. 关于集体生活和个人生活的思考
  6. ubuntu配置文件对照表
  7. Zabbix的架构配置选项
  8. Flutter 下拉刷新花式玩法
  9. web报告工具FineReport在使用方法和解决方案常见错误遇到(一)
  10. Random类——获取随机数