Ejemplo 10: Proceso FIFO (First In, First Out) con Semáforos y Swing
Descripción
En este ejemplo, implementaremos un proceso FIFO (First In, First Out) utilizando semáforos para controlar el acceso a un recurso compartido. La interfaz gráfica se desarrollará utilizando Swing, donde los usuarios podrán agregar elementos a una cola y procesarlos en orden de llegada. Al mismo tiempos se dibujará el estado de la cola en la interfaz gráfica para visualizar el proceso FIFO.
Requisitos
- Cada Proceso deberá tener un identificador único, un tiempo de procesamiento, así como un color para su representación gráfica.
- La interfaz gráfica debe permitir a los usuarios agregar procesos a la cola y visualizar el estado de la cola en tiempo real.
- Se debe implementar un mecanismo de semáforos para controlar el acceso a la cola compartida, asegurando que los procesos se procesen en orden de llegada.
- El sistema debe permitir procesar los elementos de la cola, mostrando el proceso actual en ejecución y los procesos restantes en la cola.
Implementación
A continuación se muestra un ejemplo de cómo se podría implementar este proceso FIFO utilizando Java, Swing y semáforos:
Record Proceso
package app.fifo;
import java.awt.*;
import java.util.concurrent.Semaphore;
public class Process {
private final int id;
private final int arrivalTime;
private final int processingTime;
private final Color color;
private Semaphore semaphore;
public Process(int id, int arrivalTime, int processingTime, Color color, Semaphore semaphore) {
this.id = id;
this.arrivalTime = arrivalTime;
this.processingTime = processingTime;
this.color = color;
this.semaphore = semaphore;
}
// Getters
}
Clase FIFO
package app.fifo;
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.Semaphore;
public class FIFO {
private Queue<Process> queue;
private Semaphore semaphore;
public FIFO() {
this.queue = new LinkedList<>();
this.semaphore = new Semaphore(1);
}
public void addProcess(Process FCFSProcess) throws InterruptedException {
semaphore.acquire();
try {
queue.add(FCFSProcess);
} finally {
semaphore.release();
}
}
public Process processNext() throws InterruptedException {
semaphore.acquire();
try {
return queue.poll();
} finally {
semaphore.release();
}
}
public boolean isEmpty() {
return queue.isEmpty();
}
}
Interfaz Gráfica
package app.fifo;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class FIFOApp extends JFrame {
private FIFO fifo;
private JTextArea queueArea;
private JButton addButton;
public FIFOApp() {
fifo = new FIFO();
initUI();
}
private void initUI() {
setTitle("Proceso FIFO con Semáforos");
setSize(400, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new BorderLayout());
queueArea = new JTextArea();
queueArea.setEditable(false);
add(new JScrollPane(queueArea), BorderLayout.CENTER);
addButton = new JButton("Agregar Proceso");
add(addButton, BorderLayout.SOUTH);
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
Process FCFSProcess = new Process(fifo.queue.size() + 1, (int) (Math.random() * 10), (int) (Math.random() * 10), Color.BLUE, fifo.semaphore);
fifo.addProcess(FCFSProcess);
updateQueueDisplay();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
});
}
private void updateQueueDisplay() {
StringBuilder sb = new StringBuilder();
for (Process FCFSProcess : fifo.queue) {
sb.append("Proceso ID: ").append(FCFSProcess.getId()).append(", Tiempo de Llegada: ").append(FCFSProcess.getArrivalTime()).append(", Tiempo de Procesamiento: ").append(FCFSProcess.getProcessingTime()).append("\n");
}
queueArea.setText(sb.toString());
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
FIFOApp app = new FIFOApp();
app.setVisible(true);
});
}
}
Ejemplo 9: El restaurante y los pedidos
En este ejemplo se muestra cómo un restaurante maneja los pedidos de los clientes utilizando un sistema de colas. Se explicará cómo se procesan los pedidos, cómo se asignan a los cocineros y cómo se asegura que los clientes reciban sus pedidos de manera eficiente.
Actividad 1: Introducción al diseño de interfaces
Explora los conceptos básicos del diseño de interfaces y su importancia en la experiencia del usuario.