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

  1. 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.
  2. 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.
  3. 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.
  4. Sincronización:
    • Usa synchronized para evitar que varios clientes compren boletos al mismo tiempo y superen la disponibilidad.

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

  1. Sincronización: Uso de synchronized para evitar conflictos al acceder a los recursos compartidos (boletos de cada sala).
  2. Gestión de recursos: Control de la disponibilidad de boletos en cada sala.
  3. Concurrencia: Manejo de múltiples clientes intentando comprar boletos simultáneamente.
  4. 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.

shallow focus photography of macbook
Photo by Nao Triponez on Pexels.com

Deja un comentario

Información básica sobre protección de datos Ver más

  • Responsable: Tomas Gonzalez.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento:  No se ceden o comunican datos a terceros para prestar este servicio.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

error: Content is protected !!

Descubre más desde Tomás González: Formador y Desarrollador Web

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo

Este sitio web utiliza cookies, si necesitas más información puedes visitar nuestra política de privacidad    Ver
Privacidad