Actividad 8: Simulación de Round Robin con hilos e Interfaz Gráfica
Descripción de la Actividad
En esta actividad se implementará una simulación de un sistema de planificación Round Robin utilizando hilos en Java. Además, se creará una interfaz gráfica para visualizar el estado de los procesos en ejecución, los procesos en espera y el proceso actual. Esta actividad permitirá comprender mejor cómo funciona el algoritmo de planificación Round Robin y cómo se pueden utilizar hilos e interfaces gráficas para simular sistemas operativos.
Requisitos
- Implementar una clase
Processque represente un proceso con atributos como ID, tiempo de ejecución total, tiempo restante y estado (en ejecución, en espera, terminado). - Implementar una clase
RoundRobinSchedulerque gestione la planificación de los procesos utilizando el algoritmo Round Robin. Esta clase debe tener métodos para agregar procesos, ejecutar el scheduler y actualizar el estado de los procesos. - Crear una interfaz gráfica utilizando Java Swing para mostrar el estado de los procesos en ejecución, los procesos en espera y el proceso actual. La interfaz debe actualizarse en tiempo real a medida que los procesos cambian de estado.
- Implementar la lógica para que el scheduler ejecute los procesos de acuerdo con el algoritmo Round Robin, asignando un tiempo de ejecución fijo (quantum) a cada proceso y cambiando su estado según corresponda.
- Asegurarse de que la interfaz gráfica muestre claramente el proceso actual, los procesos en espera y los procesos terminados, y que se actualice correctamente a medida que el scheduler ejecuta los procesos.
- Manejar adecuadamente las excepciones y asegurarse de que el programa no termine abruptamente.
- Agregar la funcionalidad para que el usuario pueda agregar nuevos procesos a través de la interfaz gráfica, especificando el tiempo de ejecución total para cada proceso.
- Implementar un botón para iniciar la simulación del scheduler y otro para detenerla, permitiendo al usuario controlar la ejecución de los procesos y por ende agregar nuevos procesos mientras la simulación está en ejecución.
- Utilizar un
Timerpara actualizar la interfaz gráfica en tiempo real, mostrando el estado de los procesos a medida que se ejecutan y cambian de estado. - Asegurarse de que el programa sea modular y bien organizado, utilizando clases y métodos para separar la lógica del scheduler, la representación de los procesos y la interfaz gráfica.
Código base de ejemplo
public enum ProcessState {
RUNNING,
WAITING,
TERMINATED;
final String name;
ProcessState(String name) {
this.name = name;
}
public String getName() {
return name;
}
public String toString() {
return name;
}
}
public class Process {
private int id;
private int totalExecutionTime;
private int remainingTime;
private ProcessState state;
public Process(int id, int totalExecutionTime) {
this.id = id;
this.totalExecutionTime = totalExecutionTime;
this.remainingTime = totalExecutionTime;
this.state = ProcessState.WAITING;
}
// Getters y setters para los atributos
}
public class RoundRobinScheduler {
private List<Process> FCFSProcesses;
private int quantum;
public RoundRobinScheduler(int quantum) {
this.FCFSProcesses = new ArrayList<>();
this.quantum = quantum;
}
public void addProcess(Process FCFSProcess) {
FCFSProcesses.add(FCFSProcess);
}
public void execute() {
// Lógica para ejecutar los procesos utilizando el algoritmo Round Robin
}
}
import javax.swing.*;
import java.awt.*;
public class SchedulerGUI extends JFrame {
private RoundRobinScheduler scheduler;
public SchedulerGUI(RoundRobinScheduler scheduler) {
this.scheduler = scheduler;
initUI();
}
private void initUI() {
setTitle("Round Robin Scheduler Simulation");
setSize(400, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setResizable(false);
setVisible(true);
}
public void updateProcessStatus() {
// Lógica para actualizar la interfaz gráfica con el estado de los procesos
}
// Métodos para personalizar componentes gráficos y manejar eventos de usuario
}
void main() {
int quantum = 1000; // Tiempo de ejecución fijo para cada proceso (en milisegundos)
RoundRobinScheduler scheduler = new RoundRobinScheduler(quantum);
SchedulerGUI gui = new SchedulerGUI(scheduler);
// Agregar algunos procesos de ejemplo
scheduler.addProcess(new Process(1, 5000)); // Proceso 1 con tiempo de ejecución total de 5 segundos
scheduler.addProcess(new Process(2, 3000)); // Proceso 2 con tiempo de ejecución total de 3 segundos
scheduler.addProcess(new Process(3, 7000)); // Proceso 3 con tiempo de ejecución total de 7 segundos
// Iniciar la simulación del scheduler
scheduler.execute();
}
Tareas a Realizar
- Completar la implementación de la clase
RoundRobinSchedulerpara que ejecute los procesos de acuerdo con el algoritmo Round Robin, actualizando el estado de los procesos y manejando el tiempo de ejecución. - Implementar la lógica en la clase
SchedulerGUIpara mostrar el estado de los procesos en ejecución, los procesos en espera y el proceso actual, actualizando la interfaz gráfica en tiempo real a medida que el scheduler ejecuta los procesos. - Agregar la funcionalidad para que el usuario pueda agregar nuevos procesos a través de la interfaz gráfica, especificando el tiempo de ejecución total para cada proceso.
- Implementar los botones para iniciar y detener la simulación del scheduler, permitiendo al usuario controlar la ejecución de los procesos y agregar nuevos procesos mientras la simulación está en ejecución.
- Asegurarse de que el programa maneje adecuadamente las excepciones y no termine abruptamente, especialmente al agregar nuevos procesos o al iniciar/detener la simulación.
- Utilizar un
Timerpara actualizar la interfaz gráfica en tiempo real, mostrando el estado de los procesos a medida que se ejecutan y cambian de estado. - Asegurarse de que el programa sea modular y bien organizado, utilizando clases y métodos para separar la lógica del scheduler, la representación de los procesos y la interfaz gráfica. Comentar cada parte del código para explicar su funcionamiento, especialmente la parte relacionada con la ejecución de los procesos y la actualización de la interfaz gráfica.
Recomendaciones
- Asegúrate de probar el programa con diferentes escenarios, agregando procesos con distintos tiempos de ejecución y observando cómo el scheduler maneja la planificación de los procesos.
- Considera agregar funcionalidades adicionales, como la posibilidad de eliminar procesos o modificar el tiempo de ejecución de los procesos existentes a través de la interfaz gráfica.
- Documenta tu código utilizando JavaDoc para proporcionar una descripción clara de cada clase, método y atributo, explicando su propósito y funcionamiento. Esto facilitará la comprensión del código y su mantenimiento a largo plazo.
- Recuerda que la clave para una buena simulación es la claridad en la representación de los procesos y su estado, así como la correcta implementación del algoritmo de planificación Round Robin. Asegúrate de que la interfaz gráfica sea intuitiva y fácil de usar para que los usuarios puedan interactuar con ella sin dificultades.
Entrega
- El código fuente completo de la simulación, incluyendo todas las clases y la interfaz gráfica.
- Un documento PDF que contenga:
- Portada con el nombre de los integrantes del equipo, nombre de la actividad y fecha de entrega.
- Descripción detallada de la implementación, explicando cómo se ha implementado el algoritmo Round Robin, cómo se ha diseñado la interfaz gráfica y cómo se han manejado las interacciones del usuario.
- Capturas de pantalla de la interfaz gráfica en diferentes estados (procesos en ejecución, procesos en espera, proceso actual) para evidenciar la correcta ejecución del programa.
- Respuestas a las siguientes preguntas:
- ¿Cómo se implementó el algoritmo de planificación Round Robin en la clase
RoundRobinScheduler? - ¿Cómo se actualiza la interfaz gráfica en tiempo real para reflejar el estado de los procesos?
- ¿Qué desafíos se enfrentaron al implementar la simulación y cómo se resolvieron?
- ¿Qué funcionalidades adicionales se podrían agregar a la simulación para mejorarla?
- ¿Cómo se implementó el algoritmo de planificación Round Robin en la clase
Lista de cotejo para evaluación
| Criterio | Puntos |
|---|---|
Implementación correcta del algoritmo Round Robin en la clase RoundRobinScheduler | 20 |
| Diseño y funcionalidad de la interfaz gráfica para mostrar el estado de los procesos | 20 |
| Funcionalidad para agregar nuevos procesos a través de la interfaz gráfica | 10 |
| Funcionalidad para iniciar y detener la simulación del scheduler | 10 |
| Manejo adecuado de excepciones y estabilidad del programa | 10 |
Uso de Timer para actualizar la interfaz gráfica en tiempo real | 10 |
| Documentación clara y detallada del código utilizando JavaDoc | 10 |
| Presentación en clase explicando la implementación y resultados obtenidos | 10 |
Para efectos de la entrega, se realizará una presentación en clase donde cada equipo explicará su implementación, las decisiones tomadas y los resultados obtenidos. Se evaluará la claridad de la explicación, la calidad del código y la capacidad de cada uno de los miembros del equipo para responder preguntas relacionadas con la actividad.
Recuerda que la presentación debe ser clara y concisa, enfocándose en los aspectos más relevantes de la implementación y los resultados obtenidos.
Es importante recalcar que la presentación es una parte fundamental de la evaluación y requisito para la entrega de la actividad, ya que en caso de no presentarse, el equipo no podrá ser evaluado y, por lo tanto, se considerará como no entregada la actividad, independientemente de la calidad del código o la documentación presentada.
Actividad 7: Sistema de retiro bancario
En esta actividad, simularás un sistema de retiro bancario donde múltiples clientes (hilos) intentan retirar dinero de una cuenta compartida. Deberás implementar la sincronización adecuada para evitar condiciones de carrera y garantizar que el saldo de la cuenta se actualice correctamente.
Actividad 9: CRUD con Hibernate y Swing