Q2 done!
This commit is contained in:
parent
97ce72dd93
commit
3b99a35740
9 changed files with 289 additions and 139 deletions
|
@ -5,51 +5,68 @@ import java.util.ArrayList;
|
|||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
/**
|
||||
* Hello world!
|
||||
*
|
||||
*/
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
|
||||
public class App {
|
||||
static private int numStops = 10;
|
||||
static private int numBusses = 5;
|
||||
static private int numStopPerBus = 2;
|
||||
static private int numPassengersPerBus = 2;
|
||||
static private int numPassengersPerStop = 5;
|
||||
static private int numStopPerBus = 8;
|
||||
static private int numStops = numBusses * numStopPerBus;
|
||||
static private int numPassengersPerBus = 10;
|
||||
static private int numPassengersPerStop = 3;
|
||||
static private int numPassengers = numPassengersPerStop * numStops;
|
||||
static private int numThreads = 5;
|
||||
static private int timeBetweenStops = 0;
|
||||
static private int timeEmbark = 0;
|
||||
static private int numThreadsBus = 5;
|
||||
static private int numThreadsStop = 2;
|
||||
static private int timeBetweenStops = 5;
|
||||
static private int timeEmbark = 2;
|
||||
|
||||
public static void main(String[] args) {
|
||||
ExecutorService threads = Executors.newFixedThreadPool(numThreads);
|
||||
ExecutorService threadsBus = Executors.newFixedThreadPool(numThreadsBus);
|
||||
ExecutorService threadsStop = Executors.newFixedThreadPool(numThreadsStop);
|
||||
ArrayList<Stop> stops = new ArrayList<Stop>();
|
||||
ArrayList<Bus> busses = new ArrayList<Bus>();
|
||||
ArrayList<Passenger> passengers = new ArrayList<Passenger>();
|
||||
BlockingQueue<BusInformationMessage> blockingQueue = new LinkedBlockingQueue<BusInformationMessage>();
|
||||
|
||||
// make stops
|
||||
for (int k = 0; k < numStops; k++) {
|
||||
Stop s = new Stop(k, numPassengersPerStop);
|
||||
stops.add(s);
|
||||
s.setBlockingQueue(blockingQueue);
|
||||
|
||||
//threads.submit(s);
|
||||
stops.add(s);
|
||||
s.setThreadPool(threadsStop);
|
||||
threadsStop.submit(s);
|
||||
//s.run();
|
||||
}
|
||||
|
||||
|
||||
// make busses
|
||||
for (int k = 0; k < numBusses; k++) {
|
||||
if (numStopPerBus > numStops)
|
||||
{System.out.println("More stops per bus than stops."); return;}
|
||||
|
||||
ArrayList<Stop> s_list = new ArrayList<Stop>();
|
||||
Stop s;
|
||||
// add stop. Make a bus doesnt stop multiple time at the same stop
|
||||
while (s_list.size() < numStopPerBus) {
|
||||
do {
|
||||
s = stops.get((int) (Math.random() * numStops));
|
||||
} while (s_list.contains(s));
|
||||
s_list.add(s);
|
||||
}
|
||||
|
||||
Bus b = new Bus(s_list, k, timeBetweenStops, timeEmbark, numPassengersPerBus);
|
||||
b.setBlockingQueue(blockingQueue);
|
||||
|
||||
busses.add(b);
|
||||
}
|
||||
|
||||
// make passenger
|
||||
int idPassenger = 0;
|
||||
for (Bus b : busses) {
|
||||
for (Stop start : b.getStops()) {
|
||||
|
||||
// make sure passenger can leave.
|
||||
if (start == b.getTerminus())
|
||||
continue;
|
||||
|
||||
|
@ -70,22 +87,30 @@ public class App {
|
|||
}
|
||||
}
|
||||
|
||||
// pretty print!
|
||||
for (Bus b : busses) {
|
||||
b.printDetails();
|
||||
}
|
||||
|
||||
System.out.println("-----".repeat(5) + " START " + "-----".repeat(5));
|
||||
|
||||
// start bus thread
|
||||
// (here so init logs are clean)
|
||||
for (Bus b : busses) {
|
||||
threads.submit(b);
|
||||
//b.run();
|
||||
threadsBus.submit(b);
|
||||
}
|
||||
|
||||
threads.shutdown();
|
||||
|
||||
// block bus pool
|
||||
threadsBus.shutdown();
|
||||
try {
|
||||
threads.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
|
||||
threadsBus.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
|
||||
} catch (InterruptedException e) {}
|
||||
|
||||
// block stop pool once bus have finished
|
||||
|
||||
threadsStop.shutdown();
|
||||
try {
|
||||
threadsStop.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
|
||||
} catch (InterruptedException e) {}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package usherbrooke.ift630;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
|
||||
public class Bus extends Thread {
|
||||
private ArrayList<Passenger> passengers;
|
||||
|
@ -10,22 +11,29 @@ public class Bus extends Thread {
|
|||
private int maxCapacity;
|
||||
private int currentCapacity;
|
||||
private int timeBetweenStops;
|
||||
private int timeToNextStop;
|
||||
private int timeEmbark;
|
||||
private Stop nextStop;
|
||||
private BlockingQueue<BusInformationMessage> blockingQueue;
|
||||
|
||||
// returns time for a single passenger to embark.
|
||||
private int timeEmbark() {
|
||||
return (int) (Math.random() * timeEmbark);
|
||||
}
|
||||
|
||||
private int timeBetweenStops() {
|
||||
return (int) (Math.random() * timeBetweenStops);
|
||||
// set time between stop.
|
||||
private int calculateTimeBetweenStops() {
|
||||
timeToNextStop = (int) ((timeBetweenStops / 3) + (Math.random() * 2 * timeBetweenStops / 3));
|
||||
return timeToNextStop;
|
||||
}
|
||||
|
||||
// check if a passenger must leave at next stop.
|
||||
private boolean stopAsked() {
|
||||
boolean res = false;
|
||||
for (Passenger p : passengers){
|
||||
if (p.getDest() == nextStop) {
|
||||
res = true;
|
||||
Logger.getInstance().print(id, "[BUS] " + name + " stop asked!");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -33,25 +41,39 @@ public class Bus extends Thread {
|
|||
return res;
|
||||
}
|
||||
|
||||
private Stop goToNextStop() {
|
||||
// travel to next stop. Waits the travel time.
|
||||
private Stop goToNextStop() throws InterruptedException, IndexOutOfBoundsException {
|
||||
// if no reason to stop, skip current stop
|
||||
try {
|
||||
boolean nextStopEmpty, overMaxCapacity;
|
||||
do {
|
||||
nextStop = stops.remove(0);
|
||||
} while ((getNextStopPassengers().isEmpty() || currentCapacity >= maxCapacity) && !stopAsked());
|
||||
|
||||
} catch (IndexOutOfBoundsException e) {
|
||||
nextStop = null;
|
||||
}
|
||||
sendNextStopInfo();
|
||||
|
||||
waitStop();
|
||||
|
||||
overMaxCapacity = currentCapacity >= maxCapacity;
|
||||
nextStopEmpty = getNextStopPassengers().isEmpty();
|
||||
|
||||
if (overMaxCapacity)
|
||||
Logger.getInstance().print(id, "[BUS] " + name + " im full, sorry!");
|
||||
if (nextStopEmpty && !stopAsked())
|
||||
Logger.getInstance().print(id, "[BUS] " + name + " next " + nextStop.getStopName() + " is empty!");
|
||||
} while (!stopAsked() && (nextStopEmpty || overMaxCapacity));
|
||||
|
||||
try {
|
||||
Thread.sleep(timeBetweenStops() * 1000);
|
||||
} catch (InterruptedException e) {
|
||||
}
|
||||
return nextStop;
|
||||
}
|
||||
|
||||
// TODO what
|
||||
// send Bus info msg to next stop
|
||||
private void sendNextStopInfo() throws InterruptedException{
|
||||
BusInformationMessage info = new BusInformationMessage(this, nextStop, timeToNextStop);
|
||||
synchronized(blockingQueue) {
|
||||
blockingQueue.put(info);
|
||||
}
|
||||
}
|
||||
|
||||
// get all passenger waiting at next stop
|
||||
// useful for knowing if we should stop
|
||||
private ArrayList<Passenger> getNextStopPassengers() {
|
||||
ArrayList<Passenger> res = new ArrayList<Passenger>();
|
||||
|
||||
|
@ -66,57 +88,82 @@ public class Bus extends Thread {
|
|||
return res;
|
||||
}
|
||||
|
||||
// lock until passenger got in
|
||||
private void waitEmbark() throws InterruptedException {
|
||||
synchronized (this) {
|
||||
sleep(timeEmbark());
|
||||
}
|
||||
}
|
||||
|
||||
// lock until passenger got out
|
||||
private void waitStop() throws InterruptedException {
|
||||
synchronized (this) {
|
||||
sleep(timeToNextStop);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
// run until terminus
|
||||
while (nextStop != null) {
|
||||
Logger.getInstance().print(id, "[BUS] hop into " + name + " at stop " + nextStop.getName() + "!");
|
||||
// new stop !
|
||||
Logger.getInstance().print(id, "[BUS] " + name + " reached stop " + nextStop.getStopName() + "!");
|
||||
|
||||
disembarkPassengers();
|
||||
embarkPassengers();
|
||||
calculateTimeBetweenStops();
|
||||
|
||||
try {
|
||||
nextStop = goToNextStop();
|
||||
} catch (IndexOutOfBoundsException e) {
|
||||
nextStop = null;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Logger.getInstance().print(id, "[BUS] exception: " + e.getMessage());
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
Logger.getInstance().print(id, "[BUS] exception: " + e.toString());
|
||||
}
|
||||
Logger.getInstance().print(id, "[BUS] " + name + " exiting!");
|
||||
}
|
||||
|
||||
Bus(ArrayList<Stop> s, int id, int timeStop, int timeEmbark, int maxCapacity) {
|
||||
this.timeBetweenStops = timeStop;
|
||||
this.timeEmbark = timeEmbark;
|
||||
this.timeBetweenStops = timeStop * 1000 + 1;
|
||||
this.timeEmbark = timeEmbark * 1000 + 1;
|
||||
this.name = "Bus n°" + id;
|
||||
this.id = id;
|
||||
this.passengers = new ArrayList<Passenger>();
|
||||
this.stops = s;
|
||||
this.nextStop = stops.remove(0);
|
||||
this.nextStop = stops.get(0);
|
||||
this.currentCapacity = 0;
|
||||
this.maxCapacity = maxCapacity;
|
||||
}
|
||||
|
||||
public synchronized void disembarkPassengers() {
|
||||
Logger.getInstance().print(id, "[BUS] waiting mutex for " + nextStop.getName());
|
||||
synchronized (nextStop.getMutex()) {
|
||||
// disembark passenger at a stop. Synchronizes, locks on that stop, and waits.
|
||||
public synchronized void disembarkPassengers() throws InterruptedException {
|
||||
// lock on next stop
|
||||
synchronized (nextStop) {
|
||||
for (Passenger p : passengers) {
|
||||
waitEmbark();
|
||||
|
||||
Logger.getInstance().print(id,
|
||||
"\t[DISEMBARK] " + p.getName() + " at " + nextStop.getName());
|
||||
"\t[DISEMBARK] " + p.getName() + " at " + nextStop.getStopName());
|
||||
|
||||
if (p.getDest() == nextStop) {
|
||||
p.disembark();
|
||||
currentCapacity--;
|
||||
}
|
||||
}
|
||||
Logger.getInstance().print(id, "[BUS] release mutex for " + nextStop.getName());
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void embarkPassengers() {
|
||||
Logger.getInstance().print(id, "[BUS] waiting mutex for " + nextStop.getName());
|
||||
synchronized (nextStop.getMutex()) {
|
||||
// embark passenger at a stop. Synchronizes, locks on that stop, and waits.
|
||||
// check for overflow, and if passenger should embark in the first place
|
||||
public synchronized void embarkPassengers() throws InterruptedException {
|
||||
synchronized (nextStop) {
|
||||
try {
|
||||
ArrayList<Passenger> list = nextStop.getPassengerByDest(stops);
|
||||
for (Passenger p : list) {
|
||||
Thread.sleep(timeEmbark() * 1000);
|
||||
waitEmbark();
|
||||
if (currentCapacity >= maxCapacity)
|
||||
continue;
|
||||
passengers.add(p);
|
||||
|
@ -124,40 +171,46 @@ public class Bus extends Thread {
|
|||
currentCapacity++;
|
||||
|
||||
Logger.getInstance().print(id,
|
||||
"\t[EMBARK] " + p.getName() + " at " + nextStop.getName());
|
||||
"\t[EMBARK] " + p.getName() + " at " + nextStop.getStopName());
|
||||
}
|
||||
} catch (IndexOutOfBoundsException | InterruptedException e) {
|
||||
} catch (IndexOutOfBoundsException e) {
|
||||
Logger.getInstance().print(id, "Exception: " + e.getMessage());
|
||||
}
|
||||
Logger.getInstance().print(id, "[BUS] release mutex for " + nextStop.getName());
|
||||
}
|
||||
}
|
||||
|
||||
// pretty print!
|
||||
public void printDetails(int indent) {
|
||||
Logger.getInstance().print(id, "\t".repeat(indent) + "---".repeat(3) + " Bus details " + "---".repeat(3));
|
||||
Logger.getInstance().print(id, "\t".repeat(indent) + name);
|
||||
Logger.getInstance().print(id, "\t".repeat(indent) + "time between stops: " + timeBetweenStops);
|
||||
Logger.getInstance().print(id, "\t".repeat(indent) + "max capacity: " + maxCapacity);
|
||||
Logger.getInstance().print(id, "\t".repeat(indent) + "current stop: " + nextStop.getName());
|
||||
Logger.getInstance().print(id, "\t".repeat(indent) + "current stop: " + nextStop.getStopName());
|
||||
Logger.getInstance().print(id, "\t".repeat(indent) + "stops: ");
|
||||
|
||||
|
||||
if (nextStop != stops.get(0))
|
||||
nextStop.printDetails(id, indent + 1);
|
||||
for (Stop s : stops) {
|
||||
s.printDetails(id, indent + 1);
|
||||
}
|
||||
}
|
||||
|
||||
// pretty print w/ 0 indent
|
||||
public void printDetails() {
|
||||
printDetails(0);
|
||||
}
|
||||
|
||||
// return stop list
|
||||
public ArrayList<Stop> getStops() {
|
||||
ArrayList<Stop> res = new ArrayList<Stop>(stops);
|
||||
if (nextStop != stops.get(0))
|
||||
res.add(0, nextStop);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
// return last stop
|
||||
public Stop getTerminus() {
|
||||
return stops.get(stops.size() - 1);
|
||||
}
|
||||
|
@ -165,4 +218,8 @@ public class Bus extends Thread {
|
|||
public String getNameBus() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setBlockingQueue(BlockingQueue<BusInformationMessage> q) {
|
||||
blockingQueue = q;
|
||||
}
|
||||
}
|
||||
|
|
39
src/main/java/usherbrooke/ift630/BusInformationMessage.java
Normal file
39
src/main/java/usherbrooke/ift630/BusInformationMessage.java
Normal file
|
@ -0,0 +1,39 @@
|
|||
package usherbrooke.ift630;
|
||||
|
||||
class BusInformationMessage {
|
||||
private Bus bus; // origin
|
||||
private Stop stop; //dest
|
||||
private int timeToStop; // info
|
||||
|
||||
public BusInformationMessage(Bus b, Stop s, int time) {
|
||||
this.bus = b;
|
||||
this.stop = s;
|
||||
this.timeToStop = time;
|
||||
}
|
||||
|
||||
// throws unauth if stop shouldt see
|
||||
public Bus getBus(Stop s) throws UnauthorizedException {
|
||||
if (s != stop) {
|
||||
throw new UnauthorizedException("UnauthorizedException");
|
||||
}
|
||||
|
||||
return bus;
|
||||
}
|
||||
|
||||
// throws unauth if stop shouldt see
|
||||
public Stop getStop(Stop s) throws UnauthorizedException {
|
||||
if (s != stop) {
|
||||
throw new UnauthorizedException("UnauthorizedException");
|
||||
}
|
||||
|
||||
return stop;
|
||||
}
|
||||
|
||||
// throws unauth if stop shouldt see
|
||||
public int getTimeToStop(Stop s) throws UnauthorizedException {
|
||||
if (s != stop) {
|
||||
throw new UnauthorizedException("UnauthorizedException");
|
||||
}
|
||||
return timeToStop;
|
||||
}
|
||||
}
|
9
src/main/java/usherbrooke/ift630/ExitException.java
Normal file
9
src/main/java/usherbrooke/ift630/ExitException.java
Normal file
|
@ -0,0 +1,9 @@
|
|||
package usherbrooke.ift630;
|
||||
|
||||
public class ExitException extends Exception {
|
||||
ExitException() {}
|
||||
|
||||
public ExitException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
package usherbrooke.ift630;
|
||||
|
||||
public class NotFoundException extends Exception {
|
||||
NotFoundException() {}
|
||||
|
||||
public NotFoundException(String message)
|
||||
{
|
||||
super(message);
|
||||
}
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
package usherbrooke.ift630;
|
||||
|
||||
public class OverCapacityException extends Exception {
|
||||
OverCapacityException() {}
|
||||
|
||||
public OverCapacityException(String message)
|
||||
{
|
||||
super(message);
|
||||
}
|
||||
}
|
|
@ -14,8 +14,10 @@ public class Passenger {
|
|||
this.start = start;
|
||||
}
|
||||
|
||||
// unused, *yet*
|
||||
public synchronized void embark() {}
|
||||
|
||||
// unused, *yet*
|
||||
public synchronized void disembark() {}
|
||||
|
||||
public Stop getStart() {
|
||||
|
@ -30,16 +32,19 @@ public class Passenger {
|
|||
return name;
|
||||
}
|
||||
|
||||
// Pretty print, with color!
|
||||
public void printDetails(int color, int indent) {
|
||||
Logger.getInstance().print(color, "\t".repeat(indent) + "---".repeat(3) + " Passenger details " + "---".repeat(3));
|
||||
Logger.getInstance().print(color, "\t".repeat(indent) + name + " start: " + start.getName() + " dest: " + dest.getName());
|
||||
Logger.getInstance().print(color, "\t".repeat(indent) + name + " start: " + start.getStopName() + " dest: " + dest.getStopName());
|
||||
}
|
||||
|
||||
// Pretty print, with indent!
|
||||
public void printDetails(int indent) {
|
||||
Logger.getInstance().print(id, "\t".repeat(indent) + "---".repeat(3) + " Passenger details " + "---".repeat(3));
|
||||
Logger.getInstance().print(id, "\t".repeat(indent) + name + " start: " + start.getName() + " dest: " + dest.getName());
|
||||
Logger.getInstance().print(id, "\t".repeat(indent) + name + " start: " + start.getStopName() + " dest: " + dest.getStopName());
|
||||
}
|
||||
|
||||
// Pretty print!
|
||||
public void printDetails() {
|
||||
printDetails(0);
|
||||
}
|
||||
|
|
|
@ -1,28 +1,61 @@
|
|||
package usherbrooke.ift630;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
public class Stop implements Runnable {
|
||||
public class Stop extends Thread {
|
||||
private String name;
|
||||
private int id;
|
||||
private int maxCapacity;
|
||||
private int indent = 0;
|
||||
private ArrayList<Passenger> passengers;
|
||||
private Lock mutex = new ReentrantLock();
|
||||
private ExecutorService threads;
|
||||
private BlockingQueue<BusInformationMessage> blockingQueue;
|
||||
|
||||
// TODO lock mutex when stop is used
|
||||
@Override
|
||||
public void run() {
|
||||
// xd do nothing for now
|
||||
//for (Passenger p : passengers) {
|
||||
// //
|
||||
//}
|
||||
|
||||
// print bus info times.
|
||||
private void displayInfos(int indent) throws InterruptedException, ExitException{
|
||||
BusInformationMessage info = null;
|
||||
|
||||
// lock queue, get head
|
||||
synchronized (blockingQueue) {
|
||||
info = blockingQueue.poll();
|
||||
}
|
||||
// get infos
|
||||
try {
|
||||
try {
|
||||
int time = info.getTimeToStop(this) / 1000;
|
||||
// if everything is alright, print
|
||||
Logger.getInstance().print(id,
|
||||
"\t".repeat(indent) + "[STOP] " + info.getBus(this).getNameBus() + " arrives in " + time + "s");
|
||||
// else, catch
|
||||
} catch (NullPointerException e) {}
|
||||
|
||||
} catch (UnauthorizedException e) {
|
||||
// if unauth, requeue message.
|
||||
synchronized (blockingQueue) {
|
||||
blockingQueue.add(info);
|
||||
}
|
||||
}
|
||||
|
||||
// loop, and ensure that every stop is reactive
|
||||
synchronized (this) {
|
||||
threads.submit(this);
|
||||
sleep(10);
|
||||
throw new ExitException();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
for (;;) {
|
||||
displayInfos(indent);
|
||||
}
|
||||
} catch (InterruptedException | ExitException e) {}
|
||||
}
|
||||
|
||||
// run once. Then, queue the same thread, and exit.
|
||||
// Message a bus their current number of passenger ; and the
|
||||
// number of passenger willing to take this bus.
|
||||
Stop(int id, int maxCapacity) {
|
||||
this.id = id;
|
||||
this.name = "Stop " + id;
|
||||
|
@ -30,20 +63,18 @@ public class Stop implements Runnable {
|
|||
this.maxCapacity = maxCapacity;
|
||||
}
|
||||
|
||||
public Passenger getPassenger() {
|
||||
return passengers.get(0);
|
||||
}
|
||||
|
||||
public void addPassenger(Passenger p) {
|
||||
passengers.add(p);
|
||||
}
|
||||
|
||||
// return all passenger that stops at a stop in the list
|
||||
public ArrayList<Passenger> getPassengerByDest(ArrayList<Stop> list) {
|
||||
// res for a little cleaner code
|
||||
ArrayList<Passenger> res = new ArrayList<Passenger>();
|
||||
// for all given stop
|
||||
for (Stop s : list) {
|
||||
// for all passenger at this stop
|
||||
for (Passenger p : passengers) {
|
||||
// if they stop at this stop, add to res
|
||||
if (p.getDest() == s) {
|
||||
res.add(p);
|
||||
}
|
||||
|
@ -53,7 +84,7 @@ public class Stop implements Runnable {
|
|||
return res;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
public String getStopName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
|
@ -65,10 +96,6 @@ public class Stop implements Runnable {
|
|||
return maxCapacity;
|
||||
}
|
||||
|
||||
public Lock getMutex() {
|
||||
return mutex;
|
||||
}
|
||||
|
||||
public void printDetails(int color, int indent) {
|
||||
Logger.getInstance().print(color, "\t".repeat(indent) + "---".repeat(3) + " Stop details " + "---".repeat(3));
|
||||
Logger.getInstance().print(color, "\t".repeat(indent) + name);
|
||||
|
@ -91,24 +118,23 @@ public class Stop implements Runnable {
|
|||
printDetails(0);
|
||||
}
|
||||
|
||||
public void busArrive() {
|
||||
synchronized(this) {
|
||||
mutex.lock();
|
||||
}
|
||||
}
|
||||
|
||||
public void busLeave() {
|
||||
synchronized(this) {
|
||||
mutex.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
public void removePassenger(Passenger p) {
|
||||
// Logger.getInstance().print(id, "Passenger " + p.getName() + " left " + name);
|
||||
try {
|
||||
passengers.remove(p);
|
||||
} catch (Exception e) {
|
||||
System.out.println("exception" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void setIndent(int indent) {
|
||||
this.indent = indent;
|
||||
}
|
||||
|
||||
public void setBlockingQueue(BlockingQueue<BusInformationMessage> q) {
|
||||
blockingQueue = q;
|
||||
}
|
||||
|
||||
public void setThreadPool(ExecutorService threads) {
|
||||
this.threads = threads;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
package usherbrooke.ift630;
|
||||
|
||||
public class UnauthorizedException extends Exception {
|
||||
public UnauthorizedException() {}
|
||||
|
||||
public UnauthorizedException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue