Planteamiento
Un centro de trabajo tiene una única impresora compartida por varios usuarios. Cada usuario puede enviar un documento para imprimir, pero deben esperar su turno, ya que la impresora solo puede procesar un documento a la vez. Diseña un programa en Java que simule este sistema utilizando hilos.
Requisitos
- Clases necesarias:
- Una clase
Impresora
que gestione el acceso exclusivo a la impresora. - Una clase
Usuario
que represente a los hilos que envían documentos para imprimir.
- Una clase
- Funcionamiento del sistema:
- Cada usuario debe intentar enviar su documento a la impresora.
- Si la impresora está ocupada, el usuario debe esperar hasta que esté libre.
- Una vez que la impresora termine de procesar un documento, se notificará al siguiente usuario.
- Simulación:
- Simula un sistema con una impresora y 5 usuarios.
- Cada usuario envía 3 documentos para imprimir.
- Salida esperada:
- Muestra mensajes indicando cuándo un usuario envía un documento, cuándo la impresora empieza a procesarlo y cuándo termina.
Código Base
class Impresora {
public synchronized void imprimir(String documento, String usuario) throws InterruptedException {
System.out.println(usuario + " está imprimiendo: " + documento);
Thread.sleep(2000); // Simula el tiempo de impresión
System.out.println("Impresión completada: " + documento + " por " + usuario);
}
}
class Usuario implements Runnable {
private final Impresora impresora;
private final String nombre;
public Usuario(Impresora impresora, String nombre) {
this.impresora = impresora;
this.nombre = nombre;
}
@Override
public void run() {
for (int i = 1; i <= 3; i++) { // Cada usuario imprime 3 documentos
String documento = "Documento-" + i;
try {
impresora.imprimir(documento, nombre);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.out.println("Hilo interrumpido.");
}
}
}
}
public class SistemaImpresion {
public static void main(String[] args) {
Impresora impresora = new Impresora();
// Crear 5 usuarios (hilos)
for (int i = 1; i <= 5; i++) {
Thread usuario = new Thread(new Usuario(impresora, "Usuario-" + i));
usuario.start();
}
}
}
Requisitos de Salida
El programa debe mostrar una salida como esta (puede variar debido a la concurrencia):
Usuario-1 está imprimiendo: Documento-1
Impresión completada: Documento-1 por Usuario-1
Usuario-2 está imprimiendo: Documento-1
Impresión completada: Documento-1 por Usuario-2
Usuario-3 está imprimiendo: Documento-1
Impresión completada: Documento-1 por Usuario-3
...
Usuario-5 está imprimiendo: Documento-3
Impresión completada: Documento-3 por Usuario-5
Conceptos Evaluados
- Uso correcto de
synchronized
para garantizar que solo un usuario pueda imprimir a la vez. - Creación y gestión de hilos mediante la implementación de
Runnable
. - Simulación de un recurso compartido (la impresora) y su acceso ordenado.
Este programa básico incluye los elementos esenciales para trabajar con hilos en Java y asegura un nivel de dominio necesario para manejar concurrencia básica.