Ejemplos

Ejemplo 10: Proceso FIFO (First In, First Out) con Semáforos y Swing

Implementación de un proceso FIFO utilizando semáforos para controlar el acceso a un recurso compartido, con una interfaz gráfica en 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);
        });
    }
}
Copyright Jesús Aurelio Castro Magaña © 2026