¿Cómo hacer el ejercicio del punte?
Primero creo todas las clases necesarias, las cuales son:
- Coche.java
- Puente.java
- SimulacionPuente.java
Clase Puente
La clase Puente se encarga de verificar si el coche puede cruzar (respetando las restricciones de peso y cantidad de coches) y de actualizar el estado del puente cuando un coche entra o sale.
Atributos del puente:
- pesoMaximo --> Peso maximo que el puente puede sopartar.
- maxCoches --> Número máximo de choches permitidos en el puente (3 coches).
- pesoActual --> Peso total de los coches que estan en el puente.
- numCoche --> Numero de coches que hay en el puentes.
Metodos principales:
- sePermitePaso --> Verifica si un coche puede entra al puente basado en el peso y cantidad de coches. Retorna true si puede entrar, false en caso contrario.
-
finalizarPaso --> Actualiza el estado del puente cuando un coche sale, reduciendo el peso y la cantidad de coches
public class Puente { private final int pesoMaximo = 5000; private final int maxCoches = 3; private int pesoActual = 0; private int numCoches = 0; public synchronized boolean sePermitePaso(int pesoCoche) { if (numCoches < maxCoches && (pesoActual + pesoCoche) <= pesoMaximo) { pesoActual += pesoCoche; numCoches++; return true; } return false; } public synchronized void finalizarPaso(int pesoCoche) { pesoActual -= pesoCoche; numCoches--; } }
Clase Coche:
Cada coche se modelará como un hilo:
- Tendrá un peso aleatorio entre 800 y 2000 kg
- Simulará el tiempo de llegada y cruece
- Intentará cruzar el puente llamando a
sePermitePaso
y, si se le permite, cruzará el puente. Cuando termine de cruzar, llamará afinalizarPaso
.
Atributos de coche:
- peso --> Es aleatorio y varia entre 800 y 2000kg
- puente --> hacer referencia al objeto compartido
Método principal:
-
run() --> Es el que tiene la lógica del coche
- Duerme un tiempo aleatorio para simular el tiempo de llegada.
- Intenta cruzar el puente usando
sePermitePaso
. - Si se le permite pasar, duerme otro tiempo para simular el cruce y, al terminar, llama a
finalizarPaso
para indicar que ha salido.
public class Coche extends Thread {
private int peso;
private Puente puente;
public Coche(Puente puente) {
this.puente = puente;
this.peso = (int) (800 + Math.random() * 1200);
}
@Override
public void run() {
try {
Thread.sleep((int) (1000 + Math.random() * 29000));
if (puente.sePermitePaso(peso)) {
System.out.println("Coche de " + peso + " kg cruzando el puente.");
Thread.sleep((int) (10000 + Math.random() * 40000));
System.out.println("Coche de " + peso + " kg ha cruzado el puente.");
puente.finalizarPaso(peso);
} else {
System.out.println("Coche de " + peso + " kg no puede cruzar, esperando turno.");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Clase SimulacionPuente:
La clase se encargará de crear múltipli objetos Coches e inicia la simulación.
Métodos principales:
- main() --> Crea una instancia de puente y varios coche que intentarán cruzar el puente, cada coche se inicia y espera a que llegue su turno para cruzar el puente
public class SimulacionPuente {
public static void main(String[] args) {
Puente puente = new Puente();
for (int i = 0; i < 10; i++) {
Coche coche = new Coche(puente);
coche.start();
}
}
}