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 + "人 ");
}
}
public synchronized void stationToStaion(Station station) {
System.out.println(TimeUtil.getCurrentTimeStr() + " 继续出发 车上有乘客" + this.passengerCounter + "人");
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));
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));
}
};
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());
ThreadUtil.sleepSeconds(15);
}
for (int i = 6; i <= 10; i++) {
int finalI = i;
threadPool.execute(new Bus(finalI, 15)::run);
ThreadUtil.sleepSeconds(15);
}
}
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().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 "这是" + (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);
}
}