import java.util.Comparator;

import java.util.Queue;

import java.util.concurrent.PriorityBlockingQueue;

/**

* 电梯类

*/

public class Elevator {

public static final Integer height = 20;

public static final Integer low = 0;

public static volatile boolean isUse ; //电梯开启状态.需用volatile保持可见性

public static Integer current = 0; //当前楼层

public static Integer tempCurrent ; //临时楼层去重复开门用

//上队列

public static PriorityBlockingQueue up   = new PriorityBlockingQueue(height * 3, new Comparator() {

public int compare(Order o1, Order o2) {

return o1.getHeight() - o2.getHeight();

}

});

//下队列

public static PriorityBlockingQueue down =  new PriorityBlockingQueue(height * 3, new Comparator() {

public int compare(Order o1, Order o2) {

return o2.getHeight() - o1.getHeight();

}

});

static final class Instance{

static Elevator elevator = new Elevator();

}

private Elevator(){}

public static Elevator getInstance(){

return Instance.elevator;

}

/**

* 电梯开闸放电使其运行

*/

public void startRun(){

this.isUse = true;

new Thread(new Runnable() {

@Override

public void run() {

try{

excutor();

}catch (Exception e){

e.printStackTrace();

}

}

}).start();

}

/**

* 电梯关闭

*/

public void stopRun(){

this.isUse = false;

}

/**

* 电梯私有运转方法

*/

private void excutor () throws Exception{

boolean isUp = false;

while(isUse){

if(up.isEmpty() && down.isEmpty()){

Thread.sleep(1000);//这里先手动阻塞,阻塞队列的作用没体现出来。不知道两个阻塞队列如何实现一个非空则唤醒。

}

if((current.intValue() == low.intValue()) || !up.isEmpty() ){ //默认先上

isUp = true;

}

if((current.intValue() == height.intValue()) || (up.isEmpty() && !down.isEmpty())){

isUp = false;

}

if(isUp && !up.isEmpty()){

open(up, isUp, down);

Thread.sleep(500);

}else{

isUp = false;

}

if(!isUp && !down.isEmpty()){

open(down, isUp, up);

Thread.sleep(500);

}else{

isUp = true;

}

}

}

/**

* 电梯开门

*/

private void open(Queue queue0, Boolean isUp, Queue queue){

Order order = queue0.poll();

if(order == null){

return;

}

if(order.getToUp() == null || order.getToUp() == isUp){ //允许开门的条件

current = order.getHeight();

if(tempCurrent != current){

tempCurrent = current;

System.out.println("电梯正往"+ (isUp ? "上" : "下")+"走,到" + current + "层了!");

}

open(queue0, isUp, queue);

return ;

}

//不允许开门则将其添加到另一个队列中

add(queue, order);

}

/**

* 往队列中添加指令

*/

private void add(Queue queue, Order order) {

Object[] o = queue.toArray();

for (Object object : o ) {//判断队列中是否有相同的指令,有则不添加

Order oo = (Order)object;

if(oo.getToUp() == order.getToUp() && oo.getHeight() == order.getHeight()){

return ;

}

}

queue.add(order);

}

/**

* 人类按电梯

*/

public void toGo(Integer height, Boolean isUp){

if(current > height){ //往下的队列中添加

add(down, new Order(height,isUp));

}else{ //往上的队列中添加

add(up, new Order(height,isUp));

}

}

//=================神奇分割线:指令类================

/**

* 电梯运行的指令

*/

class Order {

private Integer height; //从几层叫的电梯

private Boolean isToUp; //叫电梯的时候按的上还是下按钮

public Order(Integer height, Boolean isToUp){

this.height = height;

this.isToUp = isToUp;

}

public Integer getHeight() {

return height;

}

public Boolean getToUp() {

return isToUp;

}

}

}

//===============神奇分割线 : 测试类=======================

class People{

public static void main (String[] args) throws Exception{

Elevator elevator = Elevator.getInstance();

elevator.startRun();

elevator.toGo(3,true);

elevator.toGo(1,null);

elevator.toGo(4,false);

elevator.toGo(5,true);

elevator.toGo(7,false);

elevator.toGo(6,true);

elevator.toGo(8,false);

elevator.toGo(10,false);

elevator.toGo(9,true);

elevator.toGo(10,true);

elevator.toGo(10,null);

//        Thread.sleep(3000); //3秒后断电。

//        elevator.stopRun();

elevator.toGo(20,null);

}

}

==================运行结果如下===============

电梯正往上走,到1层了!

电梯正往上走,到3层了!

电梯正往上走,到5层了!

电梯正往上走,到6层了!

电梯正往上走,到9层了!

电梯正往上走,到10层了!

电梯正往上走,到20层了!

电梯正往下走,到10层了!

电梯正往下走,到8层了!

电梯正往下走,到7层了!

电梯正往下走,到4层了!

电梯java_用java写一个电梯 - osc_h1iyh0d1的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. java构造函数重载继承_Java基础-继承 - 写代码换盆的个人空间 - OSCHINA - 中文开源技术交流社区...

    访问权限 Java 中有三个访问权限修饰符:private.protected 以及 public,如果不加访问修饰符,表示包级可见. 可以对类或类中的成员(字段和方法)加上访问修饰符. 类可见表示其 ...

  2. java影像出租面向对象,Java中的面向对象 - zhiruochujian的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.面向对象 面向对象和面向过程的区别 过程就是函数,就是写方法,就是方法的一种实现. 对象就是将函数,属性的一种封装.用人们思考习惯的方式思考问题. 如何自定义类 修饰符 类名{ //成员变量 修饰 ...

  3. java质,JAVA分解质因子 - osc_r1gtal48的个人空间 - OSCHINA - 中文开源技术交流社区

    /*题目 分解质因数(5分) 题目内容: 每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数.比如,6可以被分解为2x3,而24可以被分解为2x2x2x ...

  4. java 原子量_Java原子量 - Rickxue的个人空间 - OSCHINA - 中文开源技术交流社区

    所谓的原子量即操作变量的操作是"原子的",该操作不可再分,因此是线程安全的. 为何要使用原子变量呢,原因是多个线程对单个变量操作也会引起一些问题.在Java5之前,可以通过vola ...

  5. java代码中的缓存类怎么找,JAVA缓存的实现 - dreamcloudz的个人空间 - OSCHINA - 中文开源技术交流社区...

    缓存可分为二大类: 一.通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式: 二.内存缓存,也就是实现一个类中静态Map,对这个Map进行 ...

  6. 蓝桥杯泊松分酒java_蓝桥杯-泊松分酒 - steven_wjg的个人空间 - OSCHINA - 中文开源技术交流社区...

    泊松是法国数学家.物理学家和力学家.他一生致力科学事业,成果颇多.有许多著名的公式定理以他的名字命名,比如概率论中著名的泊松分布. 有一次闲暇时,他提出过一个有趣的问题,后称为:"泊松分酒& ...

  7. java iw_java知识回顾 - osc_iwr5mti2的个人空间 - OSCHINA - 中文开源技术交流社区

    1.HTML * ***** 2.CSS ** ** JS *** ***** 3JS 4JS 5JS XML* *** 6XML解析** *** 7基础加强 8HTTP 服务器 9servlet * ...

  8. noa格式转java_用IDEA查看反编译 - osc_1loi8uc4的个人空间 - OSCHINA - 中文开源技术交流社区...

    目录 一 找到java编译后的class文件 二 查看编译后的结果 发现是乱码 三 将字节码文件拷贝到IDEA中 四 打开这个class文件 下面这个结果就是IDEA反编译的结果 // // Sour ...

  9. db2 java存储过程,db2存储过程 - 辜圆圆的个人空间 - OSCHINA - 中文开源技术交流社区...

    db2还是用dbvis 执行存储过程比较适合 很早就想学存储过程了,之前面试时都是问会不会存储过程,然而我只能摇摇头,看了大量博客,刚好这次可以用存储过程 ,会更方便一些就来搞一搞,其实和其他变成语言 ...

最新文章

  1. 强化学习与3D视觉结合新突破:高效能在线码垛机器人
  2. pytorch转caffe
  3. char N2Char(int n)函数:将一个整数转换为字符串,并放入一个字符串中
  4. Windows命令计算MD5与SHA1/256值
  5. XenServer中Windows 7与XP多vCPU支持配置
  6. 不受微软待见的Python,如何在八年内逆袭成功?
  7. CL_CRM_REPORT_ACCRULE_ONEORDER
  8. BZOJ3064 CPU监控
  9. Spark入门(Python)
  10. 46 - 算法 -Leetcode-141-环形链表-快慢指针
  11. 正则表达式 中括号与加号
  12. 奔跑中的2015--成长之路
  13. VC编译选项 /EHa 异常处理
  14. 《Java并发编程的艺术》笔记
  15. R与Python手牵手:数据框的构建、读取与基本描述
  16. 【算法】LeetCode算法题-Length Of Last Word
  17. cpm,cpc,cps和cpa分别是什么意思
  18. Android读取手机存储文件,android 手机存储文件夹学习
  19. 取消迅雷接管浏览器下载
  20. matlab的wthcoef函数,小波去噪及其MATLAB中的函数.pdf

热门文章

  1. 东北农业大学计算机学院,学院概况
  2. 2021-11-12学习总结
  3. 微信测试号——scope参数错误或没有scope权限
  4. Jenkins+GitLab API进行代码库项目统计分析自助工具建设
  5. C-doctest-测试框架
  6. outlook html格式 效果,outlook中以html格式回复邮件
  7. 文章【人与人最大的差距,不在贫富,而在认知】读后感
  8. 免费好看的图片哪里找?这里几个经典图片网站分享给大家
  9. IDEA:本机启动报错:该网页无法正常运作,localhost将您重定向的次数过多
  10. 哈希函数在密码学中的应用