package onewayStreet; public class CarFromSense1 extends Car { static int nCarsFromSense1untilSemaphore =0; static int nActiveCarsFromSense1 =0; public static synchronized int getnActiveCarsFromSense1() { return nActiveCarsFromSense1; } public static synchronized void setnActiveCarsFromSense1(int nCars) { CarFromSense1.nActiveCarsFromSense1 = nCars; } public static synchronized int getnCarsFromSense1untilSemaphore() { return nCarsFromSense1untilSemaphore; } public static synchronized void setnCarsFromSense1untilSemaphore(int nCars) { nCarsFromSense1untilSemaphore = nCars; } public CarFromSense1(int cid, onewayStreet o) { super(cid,o); } protected void crossOnewayStreet() { int varTimeToCross= getVariableTimeToCross(); int timeToCross= varTimeToCross +FixedCrossTime; try {Thread.sleep(varTimeToCross);} catch(InterruptedException e) {}; setnCarsFromSense1untilSemaphore(getnCarsFromSense1untilSemaphore()-1); sem1.release();// another auto may try to enter oneWayStreet from sense1... try {Thread.sleep(FixedCrossTime);} catch(InterruptedException e) {};// car is crossing... System.out.println ("Car carId:" + getCarId() + " took "+ timeToCross+" ms to cross oneWayStreet from Sense1. NrCarsFromSense1untilSem:" + getnCarsFromSense1untilSemaphore()+" NrActiveCarsFromSense1: "+getnActiveCarsFromSense1() +". BYE."); setnActiveCarsFromSense1(getnActiveCarsFromSense1()-1);// car exits street => no more active... } private synchronized void trytoCrossOneWayStreet() { while ((onewayStreet.getSense()!= FROM_SENSE1)||((onewayStreet.isYellow()== true))) { getO().waitToCross();// up to nMaxCarsFromSense2toSemaphore may go from sense1 System.out.println ("Car carId:" + getCarId() + " notified from: Sense1. Onewaystreet sense now: " + getO().displaySense() + " yellow? "+onewayStreet.isYellow()+"."); } } public void run() { setnCarsFromSense1untilSemaphore(getnCarsFromSense1untilSemaphore()+1); setnActiveCarsFromSense1(getnActiveCarsFromSense1()+1); System.out.println ("Car carId:" + getCarId() + " Starts from Sense1. NrCarsUntilSem: "+getnCarsFromSense1untilSemaphore()+" : "+ getnActiveCarsFromSense1()+"."); try {sem1.acquire();} catch(InterruptedException e) {}; trytoCrossOneWayStreet(); crossOnewayStreet() ; } }