Simulación de un Sistema de Tickets en un Cine Multisala
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
Salaque represente cada sala del cine, con un número limitado de boletos. - Una clase
Clienteque represente los hilos que intentan comprar boletos. - Una clase
SistemaCineque 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
synchronizedpara 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
synchronizedpara 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.
