Skip to content
Snippets Groups Projects
Commit d5dbc7a0 authored by CELERIER Auguste's avatar CELERIER Auguste
Browse files

exo 3

parent 7f4d291e
Branches
No related tags found
No related merge requests found
......@@ -12,6 +12,9 @@ public class Railway {
private final Element[] elements;
private Direction currentDirection = null; //Paramètre pour controller la direction actuelle des trains en circulation
private int movingTrains = 0; //Nombre de trains en circulations
private int trainsWaitingRL = 0;
private int trainsWaitingLR = 0;
public Railway(Element[] elements) {
if(elements == null)
......@@ -55,13 +58,24 @@ public class Railway {
}
public synchronized void requestToMove(Train t, Direction d) throws InterruptedException {
while (movingTrains > 0 && currentDirection != d) {
wait(); // On attend si des trains circulent dans l'autre sens
}
// Autorisation de départ
currentDirection = d;
movingTrains++;
}
// Augmente le nombre de trains en attente
if (d == Direction.LR) trainsWaitingLR++;
else trainsWaitingRL++;
// Attente si un train circule déjà en sens inverse
while (movingTrains > 0 && currentDirection != d && (trainsWaitingRL <= trainsWaitingLR)) {
wait();
}
// Réduit le nombre de trains en attente
if (d == Direction.LR) trainsWaitingLR--;
else trainsWaitingRL--;
// Met à jour la direction actuelle
currentDirection = d;
movingTrains++;
}
public synchronized void trainStopped(Train t) {
movingTrains--;
......
......@@ -18,22 +18,26 @@ public class Section extends Element {
}
public synchronized void enterSection(Train t, Direction d, Railway railway) throws InterruptedException {
railway.requestToMove(t, d);
while (currentTrain != null || (currentDirection != null && currentDirection != d)) {
wait(); // Attente si la section est occupée ou si la direction est opposée
}
currentTrain = t;
currentDirection = d;
}
railway.requestToMove(t, d);
while (currentTrain != null || (currentDirection != null && currentDirection != d)) {
wait();
}
currentTrain = t;
currentDirection = d;
}
public synchronized void leaveSection(Train t, Railway railway) {
if (currentTrain == t) {
currentTrain = null;
currentDirection = null;
notifyAll(); // Réveille les trains bloqués
}
railway.trainStopped(t);
}
public synchronized void leaveSection(Train t, Railway railway) {
if (currentTrain == t) {
currentTrain = null;
currentDirection = null; // Réinitialiser la direction si la section est vide
notifyAll(); // Réveille les trains en attente
}
railway.trainStopped(t);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment