finished bridge sim i think?
This commit is contained in:
1 parent
c041d169df
commit
eaa8942116
12 files changed
+275
-247
No files matched your search
@@ -27,3 +27,7 @@ bin/
|
|||||||
|
|
||||||
### Mac OS ###
|
### Mac OS ###
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
|
*.class
|
||||||
|
*.iml
|
||||||
|
*.idea
|
||||||
Generated
-8
@@ -1,8 +0,0 @@
|
|||||||
# Default ignored files
|
|
||||||
/shelf/
|
|
||||||
/workspace.xml
|
|
||||||
# Editor-based HTTP Client requests
|
|
||||||
/httpRequests/
|
|
||||||
# Datasource local storage ignored files
|
|
||||||
/dataSources/
|
|
||||||
/dataSources.local.xml
|
|
||||||
Generated
-6
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_22" default="true" project-jdk-name="22" project-jdk-type="JavaSDK">
|
|
||||||
<output url="file://$PROJECT_DIR$/out" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
Generated
-8
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectModuleManager">
|
|
||||||
<modules>
|
|
||||||
<module fileurl="file://$PROJECT_DIR$/BridgeSimulator.iml" filepath="$PROJECT_DIR$/BridgeSimulator.iml" />
|
|
||||||
</modules>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
Generated
-124
@@ -1,124 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="Palette2">
|
|
||||||
<group name="Swing">
|
|
||||||
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
|
||||||
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
|
|
||||||
</item>
|
|
||||||
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
|
||||||
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
|
||||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
|
|
||||||
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
|
||||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
|
|
||||||
<initial-values>
|
|
||||||
<property name="text" value="Button" />
|
|
||||||
</initial-values>
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
|
||||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
|
||||||
<initial-values>
|
|
||||||
<property name="text" value="RadioButton" />
|
|
||||||
</initial-values>
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
|
||||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
|
||||||
<initial-values>
|
|
||||||
<property name="text" value="CheckBox" />
|
|
||||||
</initial-values>
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
|
||||||
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
|
|
||||||
<initial-values>
|
|
||||||
<property name="text" value="Label" />
|
|
||||||
</initial-values>
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
|
||||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
|
||||||
<preferred-size width="150" height="-1" />
|
|
||||||
</default-constraints>
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
|
||||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
|
||||||
<preferred-size width="150" height="-1" />
|
|
||||||
</default-constraints>
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
|
||||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
|
||||||
<preferred-size width="150" height="-1" />
|
|
||||||
</default-constraints>
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
|
||||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
|
||||||
<preferred-size width="150" height="50" />
|
|
||||||
</default-constraints>
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
|
||||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
|
||||||
<preferred-size width="150" height="50" />
|
|
||||||
</default-constraints>
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
|
||||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
|
||||||
<preferred-size width="150" height="50" />
|
|
||||||
</default-constraints>
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
|
||||||
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
|
||||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
|
||||||
<preferred-size width="150" height="50" />
|
|
||||||
</default-constraints>
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
|
||||||
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
|
|
||||||
<preferred-size width="150" height="50" />
|
|
||||||
</default-constraints>
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
|
||||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
|
||||||
<preferred-size width="150" height="50" />
|
|
||||||
</default-constraints>
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
|
||||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
|
||||||
<preferred-size width="200" height="200" />
|
|
||||||
</default-constraints>
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
|
||||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
|
||||||
<preferred-size width="200" height="200" />
|
|
||||||
</default-constraints>
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
|
||||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
|
||||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
|
||||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
|
||||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
|
||||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
|
|
||||||
<preferred-size width="-1" height="20" />
|
|
||||||
</default-constraints>
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
|
||||||
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
|
|
||||||
</item>
|
|
||||||
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
|
||||||
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
|
|
||||||
</item>
|
|
||||||
</group>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module type="JAVA_MODULE" version="4">
|
|
||||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
|
||||||
<exclude-output />
|
|
||||||
<content url="file://$MODULE_DIR$">
|
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
|
||||||
</content>
|
|
||||||
<orderEntry type="inheritedJdk" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
</component>
|
|
||||||
</module>
|
|
||||||
+42
-62
@@ -1,5 +1,3 @@
|
|||||||
|
|
||||||
import java.util.concurrent.Semaphore;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class BridgeSimulator {
|
public class BridgeSimulator {
|
||||||
@@ -7,78 +5,60 @@ public class BridgeSimulator {
|
|||||||
int simulationTime = 30; // In simulated seconds
|
int simulationTime = 30; // In simulated seconds
|
||||||
int emergencies = 2;
|
int emergencies = 2;
|
||||||
|
|
||||||
|
if (args.length == 2) {
|
||||||
TrafficController trafficController = new TrafficController(simulationTime, emergencies);
|
simulationTime = Integer.parseInt(args[0]);
|
||||||
|
emergencies = Integer.parseInt(args[1]);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Vehicle generateVehicle() {
|
TrafficController trafficController = new TrafficController();
|
||||||
Random rand = new Random();
|
|
||||||
|
|
||||||
int r = rand.nextInt(2);
|
List<Integer> emergencyTimes = new ArrayList<>();
|
||||||
if (r == 0) {
|
|
||||||
return new Truck();
|
|
||||||
} else if (emegencyCounter > emergencies) {
|
|
||||||
return new EmergencyVehicle();
|
|
||||||
} else {
|
|
||||||
return new Car();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
class TrafficController {
|
|
||||||
int simulationTime;
|
|
||||||
int emergencies;
|
|
||||||
int currentTime = 0;
|
|
||||||
int trafficCounter = 0;
|
|
||||||
int emegencyCounter = 0;
|
|
||||||
|
|
||||||
Semaphore northQueue = new Semaphore(10);
|
|
||||||
Semaphore southQueue = new Semaphore(10);
|
|
||||||
Semaphore bridge = new Semaphore(1);
|
|
||||||
Semaphore emergencyQueue = new Semaphore(10);
|
|
||||||
|
|
||||||
TrafficController(int simulationTime, int emergencies) {
|
|
||||||
this.simulationTime = simulationTime;
|
|
||||||
this.emergencies = emergencies;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Simulate Vehicles arriving
|
|
||||||
void addVehicle() {
|
|
||||||
Vehicle vehicle = generateVehicle();
|
|
||||||
|
|
||||||
if (vehicle instanceof EmergencyVehicle) {
|
|
||||||
emergencyQueue.add(vehicle);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Random rand = new Random();
|
Random rand = new Random();
|
||||||
int r = rand.nextInt(2);
|
for (int i = 0; i < emergencies; i++)
|
||||||
if (r == 0) {
|
emergencyTimes.add(rand.nextInt(simulationTime));
|
||||||
northQueue.add(vehicle);
|
|
||||||
} else {
|
int currentSimTime = 0;
|
||||||
southQueue.add(vehicle);
|
long lastTime = System.currentTimeMillis();
|
||||||
|
long currentTime;
|
||||||
|
|
||||||
|
System.out.println("Simulation starts for " + simulationTime + " seconds with " + emergencies + " emergency vehicles prioritized.");
|
||||||
|
while (currentSimTime <= simulationTime) {
|
||||||
|
currentTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
// if (currentTime - lastTime > 1)
|
||||||
|
// {
|
||||||
|
// trafficController.addVehicle();
|
||||||
|
// lastTime = currentTime;
|
||||||
|
// }
|
||||||
|
|
||||||
|
trafficController.addVehicle();
|
||||||
|
|
||||||
|
Integer timeToRemove = null;
|
||||||
|
for (Integer time : emergencyTimes) {
|
||||||
|
if (currentSimTime > time) {
|
||||||
|
trafficController.haveEmergency();
|
||||||
|
timeToRemove = time;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (timeToRemove != null) {
|
||||||
|
emergencyTimes.remove(timeToRemove);
|
||||||
public Semaphore getNorthQueue() {
|
|
||||||
return northQueue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Semaphore getSouthQueue() {
|
if (!trafficController.queue.isEmpty())
|
||||||
return southQueue;
|
currentSimTime += trafficController.allowVehicle();
|
||||||
|
|
||||||
|
// System.out.println(currentSimTime);
|
||||||
|
|
||||||
|
// trafficController.printQueue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Semaphore getBridge() {
|
int totalVehicles = trafficController.carCounter + trafficController.emergencyCounter + trafficController.truckCounter;
|
||||||
return bridge;
|
|
||||||
|
System.out.println("Total Vehicles: " + totalVehicles + ", Cars: " + trafficController.carCounter + ", Trucks: " + trafficController.truckCounter + ", Emergency Vehicles: " + trafficController.emergencyCounter + ", Vehicles Crossed: " + trafficController.crossings);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Semaphore getEmergencyQueue() {
|
|
||||||
return emergencyQueue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
+8
-9
@@ -1,15 +1,14 @@
|
|||||||
public class Car extends Vehicle {
|
public class Car extends Vehicle {
|
||||||
public static int crossingTime = 2;
|
public int crossingTime = 2;
|
||||||
public static int priority = 2;
|
public static int priority = 2;
|
||||||
|
|
||||||
public Car() {}
|
public Car(int id) {
|
||||||
|
super(id);
|
||||||
|
}
|
||||||
|
|
||||||
public void run() {
|
String getType() {
|
||||||
try {
|
return "Car";
|
||||||
Thread.sleep(crossingTime);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
System.out.println("Car failed to cross.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getCrossingTime() { return crossingTime; }
|
||||||
}
|
}
|
||||||
@@ -1,15 +1,14 @@
|
|||||||
public class EmergencyVehicle extends Vehicle {
|
public class EmergencyVehicle extends Vehicle {
|
||||||
public static int crossingTime = 1;
|
public int crossingTime = 1;
|
||||||
public static int priority = 1;
|
public static int priority = 1;
|
||||||
|
|
||||||
public EmergencyVehicle() {}
|
public EmergencyVehicle(int id) {
|
||||||
|
super(id);
|
||||||
|
}
|
||||||
|
|
||||||
public void run() {
|
String getType() {
|
||||||
try {
|
return "Emergency Vehicle";
|
||||||
Thread.sleep(crossingTime);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
System.out.println("Car failed to cross.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getCrossingTime() { return crossingTime; }
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,131 @@
|
|||||||
|
import java.util.*;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.concurrent.Semaphore;
|
||||||
|
|
||||||
|
public class TrafficController {
|
||||||
|
|
||||||
|
public int truckCounter = 0;
|
||||||
|
public int carCounter = 0;
|
||||||
|
public int emergencyCounter = 0;
|
||||||
|
public int crossings = 0;
|
||||||
|
|
||||||
|
boolean northLast = true;
|
||||||
|
|
||||||
|
LinkedList<Vehicle> queue = new LinkedList<>();
|
||||||
|
|
||||||
|
Semaphore northSemaphore = new Semaphore(10);
|
||||||
|
Semaphore southSemaphore = new Semaphore(10);
|
||||||
|
|
||||||
|
Semaphore bridge = new Semaphore(1);
|
||||||
|
|
||||||
|
Semaphore emergencySemaphore = new Semaphore(10);
|
||||||
|
|
||||||
|
Thread runningVehicle;
|
||||||
|
Vehicle currentVehicle = null;
|
||||||
|
|
||||||
|
public TrafficController() {}
|
||||||
|
|
||||||
|
public void haveEmergency() {
|
||||||
|
Vehicle v = new EmergencyVehicle(emergencyCounter++ + 1);
|
||||||
|
v.arrive(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vehicle generateVehicle() {
|
||||||
|
Random rand = new Random();
|
||||||
|
int r = rand.nextInt(2);
|
||||||
|
|
||||||
|
if (r == 0) {
|
||||||
|
return new Truck(truckCounter++ + 1);
|
||||||
|
} else {
|
||||||
|
return new Car(carCounter++ + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simulate Vehicles arriving
|
||||||
|
public void addVehicle() {
|
||||||
|
Vehicle vehicle = generateVehicle();
|
||||||
|
|
||||||
|
vehicle.arrive(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int allowVehicle() {
|
||||||
|
|
||||||
|
if (currentVehicle != null) {
|
||||||
|
if (!currentVehicle.hasRun) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
queue.remove(currentVehicle);
|
||||||
|
currentVehicle.leave(this);
|
||||||
|
currentVehicle = null;
|
||||||
|
bridge.release();
|
||||||
|
crossings++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Vehicle vehicle : queue) {
|
||||||
|
if (vehicle instanceof EmergencyVehicle) {
|
||||||
|
currentVehicle = vehicle;
|
||||||
|
break;
|
||||||
|
// North is ZERO so look for South going car
|
||||||
|
} else if (vehicle.direction == 1 && (northLast || northSemaphore.availablePermits() == 10)) {
|
||||||
|
currentVehicle = vehicle;
|
||||||
|
northLast = false;
|
||||||
|
break;
|
||||||
|
} else if (vehicle.direction == 0 && (!northLast || southSemaphore.availablePermits() == 10)) {
|
||||||
|
currentVehicle = vehicle;
|
||||||
|
northLast = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentVehicle == null) {
|
||||||
|
if (!queue.isEmpty()) {
|
||||||
|
System.out.println("Queue is NOT empty");
|
||||||
|
printQueue();
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
System.out.println("No vehicle to cross.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
bridge.acquire();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
System.out.println(currentVehicle.getType() + " " + currentVehicle.id + " could not cross.");
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println(currentVehicle.getType() + " " + currentVehicle.id + " starts crossing the bridge.");
|
||||||
|
runningVehicle = new Thread(currentVehicle);
|
||||||
|
runningVehicle.start();
|
||||||
|
|
||||||
|
return currentVehicle.getCrossingTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Semaphore getNorthSemaphore() {
|
||||||
|
return northSemaphore;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Semaphore getSouthSemaphore() {
|
||||||
|
return southSemaphore;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Semaphore getBridge() {
|
||||||
|
return bridge;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Semaphore getEmergencySemaphore() {
|
||||||
|
return emergencySemaphore;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void queueVehicle(Vehicle vehicle) {
|
||||||
|
this.queue.add(vehicle);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void printQueue() {
|
||||||
|
System.out.println("Queue:");
|
||||||
|
for (Vehicle vehicle : queue) {
|
||||||
|
System.out.println(vehicle.getType() + ' ' + vehicle.id + " " + vehicle.direction);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+8
-9
@@ -1,15 +1,14 @@
|
|||||||
public class Truck extends Vehicle {
|
public class Truck extends Vehicle {
|
||||||
public static int crossingTime = 3;
|
public int crossingTime = 3;
|
||||||
public static int priority = 2;
|
public static int priority = 2;
|
||||||
|
|
||||||
public Truck() {}
|
public Truck(int id) {
|
||||||
|
super(id);
|
||||||
|
}
|
||||||
|
|
||||||
public void run() {
|
String getType() {
|
||||||
try {
|
return "Truck";
|
||||||
Thread.sleep(crossingTime);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
System.out.println("Truck failed to cross.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getCrossingTime() { return crossingTime; }
|
||||||
}
|
}
|
||||||
+74
-1
@@ -1,4 +1,77 @@
|
|||||||
|
import java.util.Random;
|
||||||
|
import java.util.concurrent.Semaphore;
|
||||||
|
|
||||||
public abstract class Vehicle implements Runnable {
|
public abstract class Vehicle implements Runnable {
|
||||||
public static int crossingTime;
|
public int crossingTime;
|
||||||
public static int priority;
|
public static int priority;
|
||||||
|
int direction;
|
||||||
|
int id;
|
||||||
|
boolean hasRun = false;
|
||||||
|
|
||||||
|
public Vehicle(int id) {
|
||||||
|
Random rand = new Random();
|
||||||
|
|
||||||
|
this.direction = rand.nextInt(2);
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void arrive(TrafficController trafficController) {
|
||||||
|
Semaphore queue;
|
||||||
|
|
||||||
|
if (this instanceof EmergencyVehicle) {
|
||||||
|
queue = trafficController.getEmergencySemaphore();
|
||||||
|
} else if (direction == 0) {
|
||||||
|
queue = trafficController.getNorthSemaphore();
|
||||||
|
} else {
|
||||||
|
queue = trafficController.getSouthSemaphore();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.direction == 0)
|
||||||
|
System.out.println(this.getType() + " " + id + " approaches the bridge. Waiting (North): " + (10 - queue.availablePermits()));
|
||||||
|
else
|
||||||
|
System.out.println(this.getType() + " " + id + " approaches the bridge. Waiting (South): " + (10 - queue.availablePermits()));
|
||||||
|
|
||||||
|
if (queue.tryAcquire())
|
||||||
|
trafficController.queueVehicle(this);
|
||||||
|
else
|
||||||
|
System.out.println(this.getType() + " " + id + " saw too many cars and left.");
|
||||||
|
|
||||||
|
//
|
||||||
|
// try {
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// } catch (InterruptedException e) {
|
||||||
|
// e.printStackTrace();
|
||||||
|
// System.out.println(this.getType() + " " + id + " saw too many cars and left.");
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
public void leave(TrafficController trafficController) {
|
||||||
|
Semaphore queue;
|
||||||
|
|
||||||
|
if (this instanceof EmergencyVehicle) {
|
||||||
|
queue = trafficController.getEmergencySemaphore();
|
||||||
|
} else if (direction == 0) {
|
||||||
|
queue = trafficController.getNorthSemaphore();
|
||||||
|
} else {
|
||||||
|
queue = trafficController.getSouthSemaphore();
|
||||||
|
}
|
||||||
|
|
||||||
|
queue.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
Thread.sleep(this.crossingTime);
|
||||||
|
System.out.println(this.getType() + " " + id + " crosses the bridge.");
|
||||||
|
hasRun = true;
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
System.out.println(this.getType() + " " + id + " couldn't cross for some reason.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract String getType();
|
||||||
|
abstract int getCrossingTime();
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user