Enunciado del Ejercicio
Imagina que estás desarrollando un sistema de gestión para una fábrica en la que varios productores generan piezas y las colocan en un almacén compartido. Estas piezas luego son consumidas por trabajadores que las retiran para ensamblarlas. El almacén tiene una capacidad limitada, por lo que los productores deben esperar si está lleno, y los consumidores deben esperar si está vacío.
Objetivo
Diseña un programa en Java que simule este sistema utilizando hilos. Asegúrate de que el acceso al almacén esté sincronizado y de que no se produzcan condiciones de carrera.
Requisitos Técnicos
- Clases necesarias:
- Una clase
Almacen
que represente el almacén compartido. - Dos tipos de hilos:
- Productores: Agregan piezas al almacén.
- Consumidores: Retiran piezas del almacén.
- Una clase
- Comportamiento del almacén:
- Utiliza una estructura como
ArrayList
oLinkedList
para representar el almacén. - Implementa un mecanismo de sincronización para gestionar la capacidad máxima del almacén.
- Utiliza una estructura como
- Sincronización:
- Los productores deben esperar si el almacén está lleno.
- Los consumidores deben esperar si el almacén está vacío.
- Ejemplo de ejecución:
- Simula un sistema con 3 productores y 2 consumidores.
- Los productores generan piezas identificadas con números consecutivos (por ejemplo, «Pieza 1», «Pieza 2»).
- Cada consumidor procesa una pieza y muestra un mensaje con el identificador de la pieza consumida.
Estructura Base del Código
import java.util.LinkedList;
class Almacen {
private final int capacidad;
private final LinkedList<String> piezas = new LinkedList<>();
public Almacen(int capacidad) {
this.capacidad = capacidad;
}
public synchronized void producir(String pieza) throws InterruptedException {
while (piezas.size() == capacidad) {
wait(); // Esperar si el almacén está lleno
}
piezas.add(pieza);
System.out.println("Producido: " + pieza);
notifyAll(); // Notificar a los consumidores
}
public synchronized String consumir() throws InterruptedException {
while (piezas.isEmpty()) {
wait(); // Esperar si el almacén está vacío
}
String pieza = piezas.removeFirst();
System.out.println("Consumido: " + pieza);
notifyAll(); // Notificar a los productores
return pieza;
}
}
public class SistemaProductorConsumidor {
public static void main(String[] args) {
Almacen almacen = new Almacen(5); // Capacidad máxima del almacén
// Crear productores
Runnable productor = () -> {
int contador = 1;
try {
while (true) {
String pieza = "Pieza " + contador++;
almacen.producir(pieza);
Thread.sleep(500); // Simular tiempo de producción
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
};
// Crear consumidores
Runnable consumidor = () -> {
try {
while (true) {
almacen.consumir();
Thread.sleep(1000); // Simular tiempo de consumo
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
};
// Lanzar hilos de productores
for (int i = 0; i < 3; i++) {
new Thread(productor, "Productor-" + (i + 1)).start();
}
// Lanzar hilos de consumidores
for (int i = 0; i < 2; i++) {
new Thread(consumidor, "Consumidor-" + (i + 1)).start();
}
}
}
Requisitos de Salida
El programa debe mostrar mensajes que representen la interacción entre productores y consumidores, por ejemplo:
Producido: Pieza 1
Producido: Pieza 2
Consumido: Pieza 1
Producido: Pieza 3
Consumido: Pieza 2
Producido: Pieza 4
Producido: Pieza 5
Producido: Pieza 6
Consumido: Pieza 3
Puntos de Evaluación
- Uso correcto de sincronización con
wait()
ynotifyAll()
. - Gestión eficiente de la capacidad del almacén.
- Correcta simulación de producción y consumo con tiempos aleatorios o constantes.
- Creación de múltiples hilos para representar productores y consumidores.
Este ejercicio te permitirá consolidar tus conocimientos sobre la gestión de hilos y sincronización en Java, una habilidad clave en el desarrollo de sistemas concurrentes.