El siguiente programa simula el funcionamiento de una cola simple a la que los elementos llegan de forma aleatoria y son atendidos durante un tiempo de servicio también aleatorio. Para hacer esto se ha creado la clase Elemento, que contiene tres variables miembro: creado, en la que se almacena el instante de tiempo en la que el elemento llega a la cola; inicioProceso, en la que se almacena el instante de tiempo en la que se comienza a atender a ese elemento y tiempoProceso que es el tiempo que dura la atención del elemento.
Esta clase Elemento tiene dos funciones miembro: un constructor que genera aleatoriamente elementos y una función, llamada Dibujar que representa gráficamente la vida del elemento en el sistema. Para ello se dibuja un rectángulo (un punto gordo) al llegar el elemento a la cola, una línea inclinada cuya dimensión horizontal representa el tiempo de espera del elemento en la cola y un rectángulo horizontal que representa el tiempo de servicio del elemento. Para todo ello se utiliza una escala de 5 pixels por minuto.
import java.lang.Math;
import java.awt.*;
public class Elemento {
public int creado;
public int inicioProceso;
public int tiempoProceso;
public Elemento(int tiempo) {
creado = tiempo + (int)(Math.random() * 10);
}
public void Dibujar(Graphics g){
g.setColor(Color.black);
g.drawRect(creado*5,100,2,2);
g.drawLine(creado*5,100,inicioProceso*5,150);
g.drawRect(inicioProceso*5,150,tiempoProceso*5,2);
}
}
Se define la clase Cola, heredándola de la clase Vector, con tres nuevas funciones miembro: anadirElemento, que incluye un nuevo elemento en la cola, tieneElementos que devuelve un valor booleano indicando si la cola ya está vacía o contiene aún más elementos y procesarElemento que asigna un tiempo de proceso al elemento, lo saca de la cola y lo incluye en un nuevo vector, colaProcesados, para almacenar su información.
import java.util.*;
import Elemento;
public class Cola extends Vector {
public int anadirElememto(int tiempo){
Elemento elem;
elem = new Elemento(tiempo);
this.addElement(elem);
return elem.creado;
}
public boolean tieneElementos(){
Enumeration enum = this.elements();
return enum.hasMoreElements();
}
public Elemento procesarElemento(Vector colaProcesados){
Elemento elem =(Elemento)this.elementAt(0);
elem.tiempoProceso = (int)(Math.random() * 10);
colaProcesados.addElement(elem);
this.removeElementAt(0);
return elem;
}
}
Obsérvese como en la función anadirElemento se utiliza la función addElement de la clase Vector. En la función tieneElementos es importante darse cuenta de que Enumeration es una interface que se utiliza para recorrer los vectores sin modificarlos. En la función procesarElemento se utilizan tres funciones de la clase Vector: la ya conocida addElement, elementAt que devuelve el valor del elemento colocado en una posición determinada y removeElementAt que elimina el elemento colocado en la posición que se le pasa como argumento a la función.
La clase DrawWindow contiene un constructor y una función paint que permite dibujar en un objeto de tipo Graphics, que se pasa como argumento a la función. Nótese que para recorrer un vector también aquí se crea un objeto de tipo Enumeration.
import java.awt.*;
import java.util.Vector;
import java.util.Enumeration;
public class DrawWindow extends Panel {
private Vector v;
public DrawWindow(Vector v) {
super(new FlowLayout());
this.v=v;
}
public void paint(Graphics g) {
Elemento dib;
Enumeration e;
e = v.elements();
while(e.hasMoreElements()){
dib=(Elemento)e.nextElement();
dib.Dibujar(g);
}
}
}
La clase colaSimple contiene dos variables miembro y la función main. En esta función se crean un objeto de tipo cola, llamado Cola y otro de tipo Vector, llamado colaProcesada. Se crean también objetos de tipo Frame y DrawWindow.
En el bucle while se simula la llegada de elementos a la cola hasta el instante 100, imprimiéndose en pantalla información referente al estado de la cola.
import java.lang.Math;
import java.awt.*;
import java.util.*;
public class ColaSimple {
private static int tiempo;
private static int horaLibre;
public static void main(String args[]) {
System.out.println("Inicio de Simulación de Cola simple");
Cola cola = new Cola();
Vector colaProcesada = new Vector();
Frame ventana = new Frame("Simulación de cola simple");
DrawWindow mipanel = new DrawWindow(colaProcesada);
ventana.add(mipanel);
ventana.pack();
ventana.setSize(500,500);
while (tiempo <>
tiempo = cola.anadirElememto(tiempo);
System.out.println("Tiempo:" + tiempo+ " Items: " + cola.size());
while ((horaLibre <>
Elemento procesado = cola.procesarElemento(colaProcesada);
procesado.inicioProceso = Math.max(horaLibre, procesado.creado);
horaLibre = procesado.inicioProceso + procesado.tiempoProceso;
System.out.println("Tiempo:" + tiempo+ " Items: " + cola.size()
+ " Hora entrada: " + procesado.creado+ " Tiempo proceso: " + procesado.tiempoProceso);
}
}
ventana.show();
}
}
Se pide:
- Leer detenidamente el código del programa identificando clases, objetos, interfaces, variables miembro, funciones miembro, jerarquías…
- Compilar el programa y observar su funcionamiento.
- Variar la aplicación para que se le puedan proporcionar 4 valores que definan los rangos de las distribuciones uniformes de los tiempos de llegada y proceso. En caso de que no se proporcionen los 4 argumentos, presentar un mensaje indicando que es necesario introducir esos parámetros:
ColaSimple t1 t2 t3 t4
Siendo:
-t1: tiempo mínimo entre llegadas
-t2: tiempo máximo entre llegadas
-t3: tiempo mínimo de proceso
-t4: tiempo máximo de proceso
- Actualmente el programa finaliza su ejecución cuando el tiempo llega a 100 unidades. Modificarlo para que una vez transcurrido ese tiempo continúe con la ejecución hasta que se vacíe la cola.
- Modificar el código de tal manera que en la salida gráfica del programa se incluya otra representación en la que, siendo cada elemento una fila se muestre en un tramo azul su tiempo de espera y en una rojo su tiempo de servicio, tal y como se muestra en la siguiente figura.
- Pensar y realizar una salida gráfica distinta que de una idea del proceso que se simula.
Comentarios
Saludos¡¡ PD: Pase todo el codigo a un compilador.. pero me marcaba varios errores.. le corregi muchos pero ya despues nadamas no pude corregir todos¡¡ ;D
gracias por su colaboracion con este tema, es muy interesante.
Este es mi correo: danimatica.7@gmail.com
Gracias
danimatica.7@gmail.com
Gracias..