2021-07-28

package com.station;

import java.util.concurrent.atomic.AtomicInteger;

public class Bus {
    private int busId;
    private int stationId;

    public Bus(int busId, int stationId) {
        this.busId = busId;
        this.stationId = stationId;
    }

    private int PASSENGER_COUNT_MAX = 29;
    //表示每个站台等候的乘客的人数
    private AtomicInteger passengerCounter = new AtomicInteger(0);

    public int getBusId() {
        return busId;
    }

    public void setBusId(int busId) {
        this.busId = busId;
    }

    public int getStationId() {
        return stationId;
    }

    public void setStationId(int stationId) {
        this.stationId = stationId;
    }


    public AtomicInteger getPassengerCounter() {
        return passengerCounter;
    }

    public void setPassengerCounter(AtomicInteger passengerCounter) {
        this.passengerCounter = passengerCounter;
    }

    //乘客上车
    public void getOnTheBus(int passengerCount) {
        ThreadUtil.sleepSeconds(passengerCount);
        this.passengerCounter.addAndGet(passengerCount);
    }

    //乘客上车
    public void getOnTheBus(Station station) {
        if (station.passengerCounter.get() > 0) {
            //站台人太多,拉不下,那就拉满就走
            if (station.passengerCounter.get() + this.passengerCounter.get() > PASSENGER_COUNT_MAX) {
                int canTakeMax = PASSENGER_COUNT_MAX - this.passengerCounter.get();
                getOnTheBus(canTakeMax);
                System.out.print("上客" + canTakeMax + "人 ");
                station.decrementAndGet(canTakeMax);
            } else {
                //站台人全部拉走
                getOnTheBus(station.passengerCounter.get());
                System.out.print("上客" + station.passengerCounter.get() + "人 ");
                station.decrementAndGet(station.passengerCounter.get());
            }
        }
    }

    //乘客下车
    public synchronized void getOffTheBus(int passengerCount) {
        if (passengerCount > 0) {
            ThreadUtil.sleepSeconds(passengerCount);
            for (int i = 0; i < passengerCount; i++) {
                this.getPassengerCounter().decrementAndGet();
            }
            System.out.print("下客" + passengerCount + "人 ");
        }
    }

    //模拟Bus从一站 到 下一站
    public synchronized void stationToStaion(Station station) {
        System.out.println(TimeUtil.getCurrentTimeStr() + " 继续出发 车上有乘客" + this.passengerCounter + "人");
//            System.out.print(this);
        int i = ((station.getNextStationId() > 15) ? (30 - station.getNextStationId()) : +station.getNextStationId());
        String stationNum = String.format("%02d", i);
        ThreadUtil.sleepSeconds(station.getNextStationIdTimeDuration());
        System.out.println(TimeUtil.getCurrentTimeStr() + " 到达" + stationNum + "站");
    }

    public void getOffAll(Station station) {
        if ((station.getStationId() == 15 && station.getNextStationId() == 16)
                || (station.getStationId() == 28 && station.getNextStationId() == 1)) {
            int i = this.getPassengerCounter().get();
            getOffTheBus(i);
            //下车的乘客 还需要继续乘车
            station.addAndGet(i);
            System.out.println("到达终点,所有乘客下车");
        }
    }

    public void run() {
        boolean flag = true;
        while (true) {
            for (int i = this.stationId; i <= this.stationId + 27; i++) {
                if (flag && i == 1) {
                    flag = false;
                    System.out.println("从01站台出发");
                }else if (flag && i == 15){
                    flag = false;
                    System.out.println("从15站台出发");
                }
                final int passengerCountOfThisBuss = this.getPassengerCounter().get();
                final int passengergetOffTheBusCountOfThisBuss = CommandCenter.random.nextInt(passengerCountOfThisBuss + 1);
                getOffAll(CommandCenter.Map.get(i));
                this.getOffTheBus(passengergetOffTheBusCountOfThisBuss);
                this.setStationId(i);
                this.getOnTheBus(CommandCenter.Map.get(i));
//                System.out.print(this);
                stationToStaion(CommandCenter.Map.get(i));
            }
        }
    }

    @Override
    public String toString() {
        return " 车上有" + getPassengerCounter() + "人";
    }
}

package com.station;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.*;

public class CommandCenter {
    final static Random random = new Random();
    final static Map<Integer, Station> Map = new ConcurrentHashMap<Integer, Station>() {
        {
            put(1, new Station(1, 2, random.nextInt(6) + 3));
            put(2, new Station(2, 3, random.nextInt(6) + 3));
            put(3, new Station(3, 4, random.nextInt(6) + 3));
            put(4, new Station(4, 5, random.nextInt(6) + 3));
            put(5, new Station(5, 6, random.nextInt(6) + 3));
            put(6, new Station(6, 7, random.nextInt(6) + 3));
            put(7, new Station(7, 8, random.nextInt(6) + 3));
            put(8, new Station(8, 9, random.nextInt(6) + 3));
            put(9, new Station(9, 10, random.nextInt(6) + 3));
            put(10, new Station(10, 11, random.nextInt(6) + 3));
            put(11, new Station(11, 12, random.nextInt(6) + 3));
            put(12, new Station(12, 13, random.nextInt(6) + 3));
            put(13, new Station(13, 14, random.nextInt(6) + 3));
            put(14, new Station(14, 15, random.nextInt(6) + 3));

            put(15, new Station(15, 16, random.nextInt(6) + 3));
            put(16, new Station(16, 17, random.nextInt(6) + 3));
            put(17, new Station(17, 18, random.nextInt(6) + 3));
            put(18, new Station(18, 19, random.nextInt(6) + 3));
            put(19, new Station(19, 20, random.nextInt(6) + 3));
            put(20, new Station(20, 21, random.nextInt(6) + 3));
            put(21, new Station(21, 22, random.nextInt(6) + 3));
            put(22, new Station(22, 23, random.nextInt(6) + 3));
            put(23, new Station(23, 24, random.nextInt(6) + 3));
            put(24, new Station(24, 25, random.nextInt(6) + 3));
            put(25, new Station(25, 26, random.nextInt(6) + 3));
            put(26, new Station(26, 27, random.nextInt(6) + 3));
            put(27, new Station(27, 28, random.nextInt(6) + 3));
            put(28, new Station(28, 1, random.nextInt(6) + 3));
        }
    };

    /**
     * 模拟10辆Bus的运行
     */
    public void runAllBus() {
        //单独启的一个线程,模拟随机向各个站台加乘客
        new Thread(() -> {
            while (true) {
                ThreadUtil.sleepSeconds(1);
                Map.get(random.nextInt(28) + 1).addAndGet(1);
            }
        }).start();

        ExecutorService threadPool = new ThreadPoolExecutor(5, 10,
                1L, TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(5),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());

        for (int i = 1; i <= 5; i++) {
            int finalI = i;
            threadPool.execute(() -> new Bus(finalI, 1).run());
            //用sleep 15秒 模拟15分钟出发一辆车
            ThreadUtil.sleepSeconds(15);
        }

        for (int i = 6; i <= 10; i++) {
            int finalI = i;
            threadPool.execute(new Bus(finalI, 15)::run);
            //用sleep 15秒 模拟15分钟出发一辆车
            ThreadUtil.sleepSeconds(15);
        }
    }

    /**
     * 因为method()方法中所有bus都运行的时候,控制台输出比例混乱,这个方法只是为了简单看一台bus运行轨迹
     */
    public void runOneBus() {
        //单独启的一个线程,模拟随机向各个站台加乘客
        new Thread(() -> {
            while (true) {
                ThreadUtil.sleepSeconds(1);
                Map.get(random.nextInt(28) + 1).addAndGet(1);
            }
        }).start();

        new Thread(new Bus(1, 1)::run).start();
    }

    public static void main(String[] args) {
//        new CommandCenter().runAllBus();
        new CommandCenter().runOneBus();
        ThreadUtil.sleepSeconds(300*60);
        System.exit(0);
    }
}

package com.station;

import java.util.concurrent.atomic.AtomicInteger;

public class Station {
    private int stationId;
    private int nextStationId;
    private int nextStationIdTimeDuration;
    //表示每个站台等候的乘客的人数
    public AtomicInteger passengerCounter = new AtomicInteger(0);

    public Station(int stationId, int nextStationId, int nextStationIdTimeDuration) {
        this.stationId = stationId;
        this.nextStationId = nextStationId;
        this.nextStationIdTimeDuration = nextStationIdTimeDuration;
    }

    //给站台加人
    public int addAndGet(int addCount) {
        return passengerCounter.addAndGet(addCount);
    }

    public int decrementAndGet(int decrement) {
        int counter = 0;
        synchronized (this) {
            for (int i = 0; i < decrement; i++) {
                counter = passengerCounter.decrementAndGet();
            }
        }
        return counter;
    }

    //获取站台所有乘客
    public int removeAll() {
        int counter = 0;
        synchronized (this) {
            counter = passengerCounter.get();
            for (int i = 0; i < counter; i++) {
                passengerCounter.decrementAndGet();
            }
        }
        return counter;
    }

    @Override
    public String toString() {
        if (stationId > 15) {
//            return "这是" + (stationId % 15) + "号站台  下一站是" + (nextStationId % 15) + "号站台";
            return "这是" + (30 - stationId) + "号站台  下一站是" + (30 - stationId) + "号站台";
        } else {
            return "这是" + stationId + "号站台 下一站是" + (nextStationId>15? (30 - nextStationId):nextStationId) + "号站台";
        }
    }

    public int getStationId() {
        return stationId;
    }

    public void setStationId(int stationId) {
        this.stationId = stationId;
    }

    public int getNextStationId() {
        return nextStationId;
    }

    public void setNextStationId(int nextStationId) {
        this.nextStationId = nextStationId;
    }

    public int getNextStationIdTimeDuration() {
        return nextStationIdTimeDuration;
    }

    public void setNextStationIdTimeDuration(int nextStationIdTimeDuration) {
        this.nextStationIdTimeDuration = nextStationIdTimeDuration;
    }

    public AtomicInteger getPassengerCounter() {
        return passengerCounter;
    }

    public void setPassengerCounter(AtomicInteger passengerCounter) {
        this.passengerCounter = passengerCounter;
    }

    public static void main(String[] args) {
        System.out.println(16%15);
    }
}

package com.station;

import java.util.concurrent.TimeUnit;

public class ThreadUtil {

    public static void sleepSeconds(long timeout){
        try {
            TimeUnit.SECONDS.sleep(timeout);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void sleepMicroseconds(long timeout){
        try {
            TimeUnit.MICROSECONDS.sleep(timeout);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public class TimeUtil {
    public static final DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("HH:mm:ss");

    public static String getCurrentTimeStr() {
        return LocalDateTime.now().format(dtf2);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值