多线程实现电梯程序——Map+Queue
来源:互联网 发布:quick是什么软件 编辑:程序博客网 时间:2024/06/05 01:15
package ques.elevator;import java.util.*;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentMap;import java.util.concurrent.LinkedBlockingQueue;/** * @Author: 你本来就很二 * @Date: 2017/6/17 * @Description: */public class TakeElevByMap implements Elevator { /** * key:taker的目的层targetFloor */ private ConcurrentMap<Integer, Queue<Taker>> takersMap = new ConcurrentHashMap<>(); /** * key:waiter的所在层currentFloor */ private ConcurrentMap<Integer, Queue<Waiter>> waitersMap = new ConcurrentHashMap<>(); private int currentFloor = 1;// private boolean isToUp = true; @Override public synchronized void run() { //判断电梯有没有taker if (takersMap.isEmpty()) { System.out.println("电梯里没人..."); synchronized (waitersMap) { if (waitersMap.isEmpty()) { System.out.println("没人等待电梯..."); try { waitersMap.wait(); } catch (InterruptedException e) {} } else { toFloor(getLastestFloor(waitersMap)); } } } else { toFloor(getLastestFloor(takersMap)); } } @Override public void addTaker(Taker taker) { synchronized (takersMap) { Queue<Taker> takerQueue; if (takersMap.containsKey(taker.getTargetFloor())) { takerQueue = takersMap.get(taker.getTargetFloor()); } else { takerQueue = new LinkedBlockingQueue<>(); } takerQueue.add(taker); takersMap.put(taker.getTargetFloor(), takerQueue); } } @Override public void addWaiter(Waiter waiter) { synchronized (waitersMap) { Queue<Waiter> waiterQueue; if (waitersMap.containsKey(waiter.getCurrentFloor())) { waiterQueue = waitersMap.get(waiter.getCurrentFloor()); } else { waiterQueue = new LinkedBlockingQueue<>(); } System.out.println(waiter + " 在等电梯"); waiterQueue.add(waiter); waitersMap.put(waiter.getCurrentFloor(), waiterQueue); waitersMap.notifyAll(); } } /** * 去某一层 * @param targetFloor */ private synchronized void toFloor(int targetFloor) { //没用到 //isToUp = currentFloor < targetFloor; try { while (currentFloor > targetFloor) { Thread.sleep(500); currentFloor--; System.out.println("电梯到了第 " + currentFloor + " 层"); removeTakers(currentFloor); addTakers(currentFloor); } while (currentFloor < targetFloor) { Thread.sleep(500); currentFloor++; System.out.println("电梯到了第 " + currentFloor + " 层"); removeTakers(currentFloor); addTakers(currentFloor); } } catch (InterruptedException e) {} } /** * 上电梯 * @param floor */ private void addTakers(int floor) { synchronized (waitersMap) { if (waitersMap.containsKey(floor)) { Queue<Waiter> waitersQueue = waitersMap.get(floor); while (!waitersQueue.isEmpty()) { Waiter waiter = waitersQueue.poll(); System.out.println(waiter + " 上车了"); addTaker(waiter.toTaker()); } waitersMap.remove(floor); } } } /** * 下电梯 * @param floor */ private void removeTakers(int floor) { synchronized (takersMap) { if (takersMap.containsKey(floor)) { Queue<Taker> takerQueue = takersMap.get(floor); while (!takerQueue.isEmpty()) { Taker taker = takerQueue.poll(); System.out.println(taker + " 下电梯了"); } takersMap.remove(floor); } } } /** * 获取map(takersMap或waitersMap)中离currentFloor最近的key值 * @param map * @return */ private int getLastestFloor(ConcurrentMap map) { int tmpInt = currentFloor; int i = 0; //while不会死循环,不用担心map.isEmpty(), //因为run方法在调用该方法时已经判断了 while (true) { if (map.containsKey(tmpInt - i)) { tmpInt = tmpInt - i; break; } if (map.containsKey(tmpInt + i)) { tmpInt = tmpInt + i; break; } i++; } return tmpInt; }}
package ques.elevator;import util.random.RandomUtil;/** * @Author: 你本来就很二 * @Date: 2017/6/17 * @Description: */public class ElevatorRunThread implements Runnable { private Elevator elevator; public ElevatorRunThread(Elevator elevator) { this.elevator = elevator; } @Override public void run() { System.out.println("电梯启动,开始工作!"); //产生waiter的线程 new Thread(new Runnable() { @Override public void run() { int index = 0; //每10秒产生一个waiter while (true) { try { if (index > 5) Thread.sleep(10000); Thread.sleep(2000); } catch (Exception e) {} int currentFloor = RandomUtil.getRandomInt(1, 20); int targetFloor = RandomUtil.getRandomInt(1, 20); if (currentFloor != targetFloor) { elevator.addWaiter( new Waiter(targetFloor, currentFloor, false)); } index++; } } }).start(); while (true) { try { Thread.sleep(1000); elevator.run(); } catch (Exception e) { e.printStackTrace(); } } }}
package ques.elevator;/** * @Author: 你本来就很二 * @Date: 2017/6/17 * @Description: */public class Main { public static void main(String[] args) { new Thread(new ElevatorRunThread(new TakeElevByMap())).start(); }}
阅读全文
0 0
- 多线程实现电梯程序——Map+Queue
- 多线程实现电梯程序——先进先出
- 多线程电梯调度仿真程序
- Java集合体系总结—Map、Set、List、Queue
- UVa——540Team Queue(STL练习map、queue数组的综合使用)
- 简易电梯模拟程序
- 模拟电梯调度程序
- IOS多线程之——NSOperation和NSOperation Queue
- thread/threading/Queue/mutex——Python 多线程
- Python多线程(3)——Queue模块
- 网络编程——多线程技术实现网络聊天程序
- C++类下的学习——模拟电梯的实现
- scroll()和scrollTop()方法——实现电商网站中的电梯导航
- 【操作系统】C语言模拟操作系统实现磁盘调度算法——电梯调度算法
- 贪吃——1006 电梯问题
- 电子书——人类进步的电梯
- jzoj 高中 1286——太空电梯
- 电梯—测试用例设计
- ES02--索引mapping的写入、查看与修改
- webstorm入门5-sass、scss、less监听编译
- MySql函数应用,分组排序,子查询学习笔记
- day11 eclise使用
- 逃跑按钮
- 多线程实现电梯程序——Map+Queue
- Oracle的子查询和集合运算
- SDUT-1132 C/C++经典程序训练2---斐波那契数列
- php 面向对象杂事儿
- 你为什么总过不了英语四六级?
- 图形的保存和重绘
- Xcode 8+安装Alcatraz插件管理器
- Java注释@interface的用法
- linux 免密登陆