多线程实现电梯程序——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);            }        }    }    /**     * 获取maptakersMapwaitersMap)中离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();    }}














原创粉丝点击