¿Cómo hacer el ejercicio del punte?

Primero creo todas las clases necesarias, las cuales son:

  1. Coche.java
  2. Puente.java
  3. 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á a finalizarPaso.

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();
        }
    }
}