Enunciado
Diseña un programa en Java que simule el funcionamiento de un sistema de venta de boletos en un cine con varias salas. Los clientes llegan al sistema y cada uno intenta comprar boletos para una sala específica. El sistema debe controlar la disponibilidad de boletos en cada sala y asegurarse de que no se vendan más boletos de los disponibles.
Requisitos
- Clases necesarias:
- Una clase
Sala
que represente cada sala del cine, con un número limitado de boletos. - Una clase
Cliente
que represente los hilos que intentan comprar boletos. - Una clase
SistemaCine
que gestione las salas y coordine la compra de boletos.
- Una clase
- Gestión de boletos:
- Cada sala tiene un número fijo de boletos disponibles.
- Si un cliente intenta comprar boletos en una sala sin disponibilidad, debe recibir un mensaje indicando que no hay boletos.
- Simulación:
- Crea 3 salas, cada una con 10 boletos disponibles.
- Genera 15 clientes, que intentan comprar entre 1 y 3 boletos de una sala aleatoria.
- Sincronización:
- Usa
synchronized
para evitar que varios clientes compren boletos al mismo tiempo y superen la disponibilidad.
- Usa
Implementación
import java.util.Random;
class Sala {
private final int idSala;
private int boletosDisponibles;
public Sala(int idSala, int boletosIniciales) {
this.idSala = idSala;
this.boletosDisponibles = boletosIniciales;
}
public synchronized boolean comprarBoletos(int boletos) {
if (boletos <= boletosDisponibles) {
boletosDisponibles -= boletos;
System.out.println(Thread.currentThread().getName() + " compró " + boletos + " boletos en la Sala " + idSala);
return true;
} else {
System.out.println(Thread.currentThread().getName() + " intentó comprar " + boletos + " boletos en la Sala " + idSala + " pero no hay suficientes.");
return false;
}
}
public synchronized int getBoletosDisponibles() {
return boletosDisponibles;
}
}
class SistemaCine {
private final Sala[] salas;
public SistemaCine(int numeroSalas, int boletosPorSala) {
salas = new Sala[numeroSalas];
for (int i = 0; i < numeroSalas; i++) {
salas[i] = new Sala(i + 1, boletosPorSala);
}
}
public Sala getSalaAleatoria() {
Random random = new Random();
return salas[random.nextInt(salas.length)];
}
}
class Cliente implements Runnable {
private final SistemaCine sistemaCine;
public Cliente(SistemaCine sistemaCine) {
this.sistemaCine = sistemaCine;
}
@Override
public void run() {
Sala sala = sistemaCine.getSalaAleatoria();
Random random = new Random();
int boletosAComprar = random.nextInt(3) + 1; // Entre 1 y 3 boletos
sala.comprarBoletos(boletosAComprar);
try {
Thread.sleep(500); // Simula el tiempo de procesamiento
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
public class CineMultisala {
public static void main(String[] args) {
SistemaCine sistemaCine = new SistemaCine(3, 10); // 3 salas con 10 boletos cada una
// Crear 15 clientes
for (int i = 1; i <= 15; i++) {
new Thread(new Cliente(sistemaCine), "Cliente-" + i).start();
}
}
}
Requisitos de Salida
El programa debe mostrar mensajes similares a los siguientes:
Cliente-1 compró 2 boletos en la Sala 1
Cliente-2 compró 1 boletos en la Sala 3
Cliente-3 intentó comprar 3 boletos en la Sala 2 pero no hay suficientes.
Cliente-4 compró 2 boletos en la Sala 1
Cliente-5 compró 1 boletos en la Sala 3
...
Conceptos Evaluados
- Sincronización: Uso de
synchronized
para evitar conflictos al acceder a los recursos compartidos (boletos de cada sala). - Gestión de recursos: Control de la disponibilidad de boletos en cada sala.
- Concurrencia: Manejo de múltiples clientes intentando comprar boletos simultáneamente.
- Aleatoriedad: Simulación de clientes comprando en diferentes salas y solicitando cantidades variables de boletos.
Resumen
Este ejercicio combina sincronización, concurrencia y manejo de recursos compartidos en un sistema práctico y desafiante. Es una excelente oportunidad para aplicar conocimientos avanzados sobre hilos en Java y practicar la solución de problemas complejos en programación concurrente.