package six;
/**1.循环数组(模拟北饭三的旋转火窝)设置缓冲区的大小是4,即数组length=4,为了让每一种情况出现的可能性大点。为了构建逻辑循环数组,下标取模。在数组中有一个head和tail标记,分别模拟旋转火窝的吃货和端菜的服务员,刚开始因为没食物,还不能开始吃。建一个随机数,大于等于0.5的话服务员就端上菜,小于0.5吃货吃菜。上菜和开吃都要有个判断,判断这个缓冲区是否满了或者空了,比如头追上尾时表示空,尾追上头时表示满了。这里模拟端菜+吃菜的总次数=50次。(端菜和吃菜两个不同的操作,建议用两个线程来做,随机数的大小来控制每个线程的挂起和进行),输出要求:输出每一步服务员端了什么菜,吃货吃了什么菜,缓冲区里面还有什么菜。若满,服务员输出“菜桌已满,无法继续端菜” ,空时,吃货输出 “没菜了,服务员上菜”**/
public class Main2
{public static void main(String[] args){String[] a=new String[4]; //创建菜谱RotateArray<String> ra=new RotateArray<String>(a);String[] menu=ra.menu();costomer<String> c=new costomer<String>(ra);waiter<String> w =new waiter<String>(ra, menu);Thread t1=new Thread(c);Thread t2=new Thread(w);t2.start();t1.start();}
}
class RotateArray<T>
{public T[] tarray;  //缓冲区public int head;public int tail;public RotateArray(T[] t){this.tarray = t;}//进栈public synchronized boolean enqueue(T t){//      notifyAll();if((tail+1)%tarray.length!=head){tarray[tail%tarray.length]=t;tail=(tail+1)%tarray.length;System.out.println("服务员上菜"+t+"  桌子有的菜:  "+this.stay());return true;}elseSystem.out.println("菜桌已满,无法继续端菜"+"  桌子有的菜:  "+this.stay());
//      try
//      {//          wait();
//      } catch (InterruptedException e)
//      {//          System.out.println("costomer  error");
//      }return false;}public synchronized T outqueue(){//      notifyAll();T t=null;if(tail!=head){t=tarray[head%tarray.length];head=(head+1)%tarray.length;System.out.println("吃货者吃菜:"+t+"  桌子有的菜:  "+stay());}elseSystem.out.println("没菜了,服务员上菜"+"  桌子有的菜:  "+stay());
//      try
//      {//          wait();
//      } catch (InterruptedException e)
//      {//          System.out.println("costomer  error");
//      }return t;}//创建菜单public String[] menu(){String[] a=new String[5];a[0]="1";a[1]="2";a[2]="3";a[3]="4";a[4]="5";return a;}//查看桌子上的菜public String stay(){String str="";for(int x=head;x!=(tail%tarray.length);){str=str+tarray[x%tarray.length]+"  ";x=(x+1)%tarray.length;}return str;}
}
class waiter<T> implements Runnable
{public T[] menu;RotateArray<T> ra;public waiter(RotateArray<T> ra,T[] menu){this.menu=menu;this.ra=ra;}@Overridepublic void run(){for(int x=0;x<50;x++){ra.enqueue(menu[(int)(Math.random()*menu.length)]);   double myrandom=Math.random();if(myrandom>=0.6){       try{Thread.currentThread().sleep(100);} catch (InterruptedException e){// TODO Auto-generated catch blocke.printStackTrace();}}}}
}
class costomer<T> implements Runnable
{RotateArray<T> ra;public costomer(RotateArray<T> ra){this.ra=ra;}@Overridepublic void run(){for(int x=0;x<50;x++){ra.outqueue();double myrandom=Math.random();if(myrandom>=0.6){      try{Thread.currentThread().sleep(100);} catch (InterruptedException e){// TODO Auto-generated catch blocke.printStackTrace();}}}}
}

循环数组队列(模拟北饭三的旋转火窝)相关推荐

  1. 13004.循环数组队列(C语言)

    1 循环数组队列 1.1 队列定义 /** loop_queue.h** Created on: Mar 2, 2022* Author: xhome.*/#ifndef OTHER_TASK_LOO ...

  2. js 利用数组队列模拟多线程操作

    不知道下面的想法对不对,如有错误还请大佬斧正 需求分析 有一批设备,数量很多,需要为他们开启远程驱动(即调用后台的远程驱动接口),问题是后台处理远程驱动只能一台一台设备处理,如果设备数量很多,后台ph ...

  3. 【C++算法与数据结构学习笔记------用循环数组实现队列】

    照王晓东<数据结构>(C++语言版)上打的,以备留用. 1 #include <iostream> 2 using namespace std; 3 template<t ...

  4. 【学校实验】停车场问题:设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。

    停车场问题 问题描述 测试数据 基本要求 实现提示 代码实现 栈的实现 队列的实现 主函数的实现 问题描述 设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出.汽车在停车场内按车辆 ...

  5. 「Java数据结构」手撕数组队列及环形数组队列。

    目录 一.队列 1.基本介绍 2.示意图 3.队列的特点 二.数组模拟队列 1.数组队列初始化 2.判断方法 3.增删改查的方法 4.注意 三.数组模拟环形队列 1.初始化 2.判断方法 3.增删改查 ...

  6. 1276 士兵队列训练问题【队列模拟】

    士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  7. 营业窗口队列模拟-2

    数据结构课程设计 海纳百川,大道致远 时光荏苒,青春在这里生长,为了理想我们在这里摩拳擦掌, 岁月不居,梦想依旧灿烂,纯真的理想在这里放飞 这个设计是为了让我们在队列的理解上更加的明白,然后自己做了一 ...

  8. 【HDU 1276】士兵队列训练问题(两个队列模拟)

    题目链接 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1276 解题思路 两个队列模拟即可,注意: 必须每一轮都点完,而不是数到只剩三人了就停止. 如 ...

  9. 约瑟夫问题的学习(基于循环链表)以及基于循环数组

    这是17世纪法国数学家加斯帕在<数目中的游戏问题>讲的一个问题:15个教徒和15个非教徒在海上遇险,必须将一般的人投入海中,其他的人才能幸免于难.与实现各一个办法:30个人围成一个圈,从第 ...

最新文章

  1. 人脸对齐--Dense Face Alignment
  2. centos7 php配置,CentOS7 下nginx与PHP的安装与配置
  3. SAP RETAIL WR60 商品补货参数概述
  4. 《孙子兵法》十三篇注译(15--结束语)
  5. jQuery在线手册
  6. CodeForces - 1355E Restorer Distance(三分)
  7. 测试用例设计方法 - 场景分析法
  8. Python 的构建工具 setup.py
  9. flask 加载配置文件
  10. TotalFinder for Mac(Finder增强工具)
  11. android:textStyle 设置加粗并倾斜
  12. 把每列中最大的数据合并一行
  13. c++如何让类对象只能在堆(栈)上分配空间
  14. 24位真彩色bmp图片转8位256色带调色板的bmp图
  15. 【离散数学】陪集的详解
  16. Metricbeat监控Docker进程
  17. 限时免费!Python自学资料包免费领,再不收藏就晚了
  18. macbookair有没有touchbar_Touch Bar 真的好用吗?苹果全新 MacBook Pro 触控条上手体验...
  19. 计算某一天是一年中的第几天
  20. 每日统计部门人员考勤打卡情况并汇总通知

热门文章

  1. 11.Go语言干货-结构体
  2. uniapp nvue map组件
  3. 视频:3D打印的高超音速「客机」发动机测试
  4. 固定床和流化床理论基础操作实训教学
  5. c语言程序中间改变数组大小,结构中间的可变长度数组 – 为什么这个C代码对gcc有效...
  6. iOS应用通过蒲公英orFIR安装失败原因排查
  7. js 移动端 为什么用tap而不是click 移动端click延时解决方案
  8. 线上推广新方式,VR全景展示如何吸引用户的关注?
  9. 阿里云服务器如何买(购买流程图解)
  10. @Getter和@Setter