电梯java_用java写一个电梯 - osc_h1iyh0d1的个人空间 - OSCHINA - 中文开源技术交流社区...
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 - 中文开源技术交流社区...相关推荐
- java构造函数重载继承_Java基础-继承 - 写代码换盆的个人空间 - OSCHINA - 中文开源技术交流社区...
访问权限 Java 中有三个访问权限修饰符:private.protected 以及 public,如果不加访问修饰符,表示包级可见. 可以对类或类中的成员(字段和方法)加上访问修饰符. 类可见表示其 ...
- java影像出租面向对象,Java中的面向对象 - zhiruochujian的个人空间 - OSCHINA - 中文开源技术交流社区...
一.面向对象 面向对象和面向过程的区别 过程就是函数,就是写方法,就是方法的一种实现. 对象就是将函数,属性的一种封装.用人们思考习惯的方式思考问题. 如何自定义类 修饰符 类名{ //成员变量 修饰 ...
- java质,JAVA分解质因子 - osc_r1gtal48的个人空间 - OSCHINA - 中文开源技术交流社区
/*题目 分解质因数(5分) 题目内容: 每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数.比如,6可以被分解为2x3,而24可以被分解为2x2x2x ...
- java 原子量_Java原子量 - Rickxue的个人空间 - OSCHINA - 中文开源技术交流社区
所谓的原子量即操作变量的操作是"原子的",该操作不可再分,因此是线程安全的. 为何要使用原子变量呢,原因是多个线程对单个变量操作也会引起一些问题.在Java5之前,可以通过vola ...
- java代码中的缓存类怎么找,JAVA缓存的实现 - dreamcloudz的个人空间 - OSCHINA - 中文开源技术交流社区...
缓存可分为二大类: 一.通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式: 二.内存缓存,也就是实现一个类中静态Map,对这个Map进行 ...
- 蓝桥杯泊松分酒java_蓝桥杯-泊松分酒 - steven_wjg的个人空间 - OSCHINA - 中文开源技术交流社区...
泊松是法国数学家.物理学家和力学家.他一生致力科学事业,成果颇多.有许多著名的公式定理以他的名字命名,比如概率论中著名的泊松分布. 有一次闲暇时,他提出过一个有趣的问题,后称为:"泊松分酒& ...
- java iw_java知识回顾 - osc_iwr5mti2的个人空间 - OSCHINA - 中文开源技术交流社区
1.HTML * ***** 2.CSS ** ** JS *** ***** 3JS 4JS 5JS XML* *** 6XML解析** *** 7基础加强 8HTTP 服务器 9servlet * ...
- noa格式转java_用IDEA查看反编译 - osc_1loi8uc4的个人空间 - OSCHINA - 中文开源技术交流社区...
目录 一 找到java编译后的class文件 二 查看编译后的结果 发现是乱码 三 将字节码文件拷贝到IDEA中 四 打开这个class文件 下面这个结果就是IDEA反编译的结果 // // Sour ...
- db2 java存储过程,db2存储过程 - 辜圆圆的个人空间 - OSCHINA - 中文开源技术交流社区...
db2还是用dbvis 执行存储过程比较适合 很早就想学存储过程了,之前面试时都是问会不会存储过程,然而我只能摇摇头,看了大量博客,刚好这次可以用存储过程 ,会更方便一些就来搞一搞,其实和其他变成语言 ...
最新文章
- 强化学习与3D视觉结合新突破:高效能在线码垛机器人
- pytorch转caffe
- char N2Char(int n)函数:将一个整数转换为字符串,并放入一个字符串中
- Windows命令计算MD5与SHA1/256值
- XenServer中Windows 7与XP多vCPU支持配置
- 不受微软待见的Python,如何在八年内逆袭成功?
- CL_CRM_REPORT_ACCRULE_ONEORDER
- BZOJ3064 CPU监控
- Spark入门(Python)
- 46 - 算法 -Leetcode-141-环形链表-快慢指针
- 正则表达式 中括号与加号
- 奔跑中的2015--成长之路
- VC编译选项 /EHa 异常处理
- 《Java并发编程的艺术》笔记
- R与Python手牵手:数据框的构建、读取与基本描述
- 【算法】LeetCode算法题-Length Of Last Word
- cpm,cpc,cps和cpa分别是什么意思
- Android读取手机存储文件,android 手机存储文件夹学习
- 取消迅雷接管浏览器下载
- matlab的wthcoef函数,小波去噪及其MATLAB中的函数.pdf