Recientemente acabo de terminar mis exámenes de programación, y en este caso me gustaría compartir con vosotros el examen de programación de servicios y procesos.
El lenguaje de programación que se ha utilizado para resolver el ejercicio es Java, y el examen decía lo siguiente (Dejo la nota de cada punto por si queréis intentarlo vosotros y calcular cual sería vuestra nota):
Examen Programación Servicios y Procesos
Hacer un programa compuesto por cuatro clases: • Clases hilos HinchaGlobos (HG) (encargada de hinchar los globos) • Clase hilo PinchaGlobos (PG) (encargada de pinchar los globos) • Clase Globos (almacén de globos) • Clase Inicio (contiene el código main e instancia al resto) En relación a la clase Globos (tendremos 1 instancia de esta clase) • En el almacén habrá un máximo de 10 globos . • Se irán entregando de uno en uno numerándolos desde 1 a 10. • Una vez entregados se podrán hinchar hasta que estallen o los pinchen. • Sólo podrá haber 3 globos hinchándose a la vez. • Los globos tendrán volumen de 1 a 5. Si se llena más de 5 estallan. • El globo se entrega con un volumen inicial de l. • Los globos pueden ser pinchados mientras se están hinchando. • Se escribirá un mensaje con el número de globo cada vez que: o Se entregue un globo (indicaremos el nombre del hilo ejem: GLOBO 5 ENTREGADO A HG3) o Se hinche un globo e indicaremos el nuevo volumen (ejem: GLOBO 5 VOLUMEN 5) o Se estalle un globo por inflar de más (ejem : GLOBO 5 ESTALLA) o Un PG pinche un globo (indicaremos el nombre del hilo ejem : GLOBO 5 PINCHADO POR PG3) En relación a la clase HinchaGlobos (tendremos 5 instancias de esta clase) • (0,5) Obtendrá un globo de la clase globos cada vez y en orden salvo que no queden más. • (2) Si ya hubiera tres hinchándose se esperará hasta que uno se pinche o estalle . • Los tendremos que numerar y nombrar con HG seguido de su número. (ejem: HG3) • (1) Intentará hincharlo hasta estallarlo salvo que sea pinchando. • (1) Cada segundo aumentará el volumen del globo desde 1 hasta estallarlo. • (1) Si estalla o se pincha volverá a por otro globo hasta que no queden más. En relación a la clase PinchaGlobos (tendremos 5 instancias de esta clase) • (1) Intentará pinchar uno de los globos que se está hinchando cada un tiempo aleatorio de 1 a 10 segundos . • (1) Si no hay globos que pinchar se quedará en espera. • (0,5) Dejará de pinchar cuando no queden globos que pinchar. • Sus instancias las tendremos que numerar y nombrar con PG seguida de su número (ejem : PG 2) Los distintos apartados serán comprobados por la impresión de los mensajes detallados en la clase Globos . Se deberá tener en cuenta que aquellos dormidos deberán ser despertados convenientemente: (1) Caso de HG dormidos (1) Caso de PG dormidos
A continuación adjunto las 4 clases, lo que sería el examen perfecto con nota de 10, he intentado comentar todo para que podáis seguir el examen, si no entendéis algo lo modificaré.
1 – Clase Inicio (Main)
public class Inicio { public static void main(String[] args) { Globos g = new Globos(); //Instanciamos Globos for (int i=1;i<=5;i++) new HinchaGlobo(g,i); //Bucle que crea 5 hilos de HinchaGlobo, le pasamos los globos e i para saber el número del hilo for (int i=1;i<=5;i++) new PinchaGlobo(g,i); //Bucle que crea 5 hilos de PinchaGlobo, le pasamos los globos e i para saber el número del hilo } }
2 – Clase Globos (Almacén de globos y los métodos)
public class Globos { private int maxHinchando=3; // Número máximo de globos hinchando a la vez private int maxGlobos=10; // Número máximo de globos en el almacén private int maxVolumen=5; // Volumen máximo del globo private int nGlobo=1; // Número del globo para dar, inicialmente 1 private int hinchandoAhora=0; // Cuántos se están hinchando ahora mismo private int globos[]; // Si vale 0 el globo no está dado // Si vale 1 a maxVolumen está dado e indica su volumen // Si vale maxVolumen+1 está roto // Si vale maxVolumen+2 está pinchado public Globos() { // Constructor de Globos globos=new int[maxGlobos]; for (int i=0;i<maxGlobos;i++) globos[i]=0; // Rellenamos el almacén a 0, (ninguno dado). } public synchronized int dameGlobo() { // Método que devuelve el siguiente globo del almacen, si no quedan devuelve -1 while (hinchandoAhora==maxHinchando && nGlobo!=maxGlobos+1) { // Me espero si ya hay maxHinchando y quedan globos por dar try {wait();} catch (Exception e) {} } if (nGlobo==maxGlobos+1) return -1; // Retorno un -1 si no quedan globos por dar globos[nGlobo-1]=1; // Cambio el 0 del almacen de globos por 1 (entregado a HinchaGlobos) System.out.println("GLOBO "+nGlobo+" ENTREGADO A "+Thread.currentThread().getName()); //Informo por consola a que hilo se le da el globo hinchandoAhora++; //Sumo 1 al hinchaAhora notifyAll(); //Notifico a todos que hay un cambio return nGlobo++; //Retorno el globo } public synchronized boolean pincho() { // Método que pincha un globo, si no quedan devuelve true while (hinchandoAhora==0 && nGlobo!=maxGlobos+1){ // Me espero si no hay hinchando y quedan por pinchar try {wait();} catch (Exception e) {} } if (nGlobo==maxGlobos+1) return true; // Me aseguro de salir porque ha cambiado hinchando for (int i=0;i<maxGlobos;i++) // Busco un globo para pinchar dentro del almacen if (globos[i]>0 && globos[i]<=maxVolumen) { System.out.println("GLOBO"+(i+1)+" LO PINCHA "+Thread.currentThread().getName()); globos[i]=maxVolumen+2; hinchandoAhora--; notifyAll(); break; } return hinchandoAhora!=0; } public synchronized boolean hincho(int num) { if (globos[num-1]<=maxVolumen) globos[num-1]++; // Puede que ya esté estallado, se comprueba else return true; // si estuviera estallado, pinchado o estallase dev true if (globos[num-1]==maxVolumen+1){ // Si lo he estallado lo notifico hinchandoAhora--; System.out.println("GLOBO "+num+ " ESTALLA"); notifyAll(); return true; } else { System.out.println("GLOBO "+num+" VOLUMEN "+globos[num-1]); return false; } } }
3 – Clase HinchaGlobo
public class HinchaGlobo extends Thread { //Los globos estallan cuando pasan de 10 private Globos g; private int numero; public HinchaGlobo(Globos pg,int pnumero) { g=pg; numero=pnumero; setName("HG"+numero); start(); } @Override public void run(){ int manejado; boolean estalla; // cierto si se pincha o estalla while (true) { if ((manejado=g.dameGlobo())==-1) break ; // me da un globo o -1 si no hay mas do{ try {Thread.sleep(1000);} catch (Exception e) {} estalla=g.hincho(manejado); } while (!estalla); } // while(true) } // public run } // public class
4 – Clase PinchaGlobo
public class PinchaGlobo extends Thread{ private Globos g; private int numero; public PinchaGlobo(Globos pg,int pnumero){ g=pg; numero=pnumero; setName("PG"+numero); start(); } @Override public void run(){ int num; boolean nohaymas; do{ try {Thread.sleep((int)(Math.random()*5000));} catch (Exception e) {} // Si no quedan globos tengo que dejar de pinchar nohaymas=g.pincho(); } while (!nohaymas); // while true } // public run } // public class
¿Que nota has sacado?
Hasta aquí la entrada, no dudes en publicar tu nota.
Hola.
Gracias por este ejemplo/examen.
Está muy bien. Estoy estudiando DAM.
Saludos y gracias.
Buenas, Lolo:
Me alegra que te haya servido, yo igual estudié DAM.
Saludos!!