PROGRAMACIÓN CONCURRENTE Y PARALELA Asesora: Carmen Cerón Garnica Alumnos: Oscar Eduardo González Ramos Michael Castañeda Trejo Jesús Uriel Rodríguez Cuautle Iván Hernández Pedraza Judith Angélica Herrera Nicio Alan Job de la Luz Hernández 0 INTRODUCCIÓN Ya hemos visto el trabajo de procesos que esperan un evento para empezar a ocupar recursos. Un proceso produce el evento e que esperan los demás para poder ejecutarse. Pero ahora veremos cómo se puede pasar información de un proceso a otro. Algo que no es tan simple. Veamos la manera en ésta práctica en equipo. 1 DESARROLLO CAFÉ LISTAS LIGADAS Considere un sistema computacional para un café. Donde el programa se pase la información actual de un proceso a otro. Clase 1 | Café import java.awt.*; import java.applet.Applet; import java.awt.event.*; public class Cafe extends Applet implements ActionListener { private Button hamburguesa, papasFritas, refrescoCola, cocinada; private TextField nuevaOrden = new TextField("Esperando orden",30); private TextArea listaMostrar = new TextArea("Lista de proceso\n",5,20,TextArea.SCROLLBARS_VERTICAL_ONLY); private TextField cocinando = new TextField("No hay nada cocinandose",30); private Orden orden, completa; public void init() { hamburguesa = new Button("Hamburguesa"); add(hamburguesa); hamburguesa.addActionListener(this); papasFritas = new Button("Papas"); add(papasFritas); papasFritas.addActionListener(this); refrescoCola = new Button("Soda"); add(refrescoCola); refrescoCola.addActionListener(this); add(nuevaOrden); 2 add(listaMostrar); add(cocinando); cocinada = new Button("Listo"); add(cocinada); cocinada.addActionListener(this); orden = new Orden(); ListaLigada listaL = new ListaLigada(listaMostrar); completa = new Orden(); Mesero mesero = new Mesero(nuevaOrden, orden, listaL); mesero.start(); Chef chef = new Chef(cocinando, completa, listaL); chef.start(); } public void actionPerformed(ActionEvent event) { if(event.getSource() == hamburguesa) orden.notificarEvento("hamburguesa"); if(event.getSource() == papasFritas) orden.notificarEvento("papasFritas"); if(event.getSource() == refrescoCola) orden.notificarEvento("refrescoCola"); if(event.getSource() == cocinada) completa.notificarEvento("Listo"); } } 3 Clase 2 | Chef import java.awt.*; import java.applet.Applet; import java.awt.event.*; public class Chef extends Thread { private TextField mostrar; private Orden completa; private ListaLigada listaL; public Chef(TextField mostrar, Orden completa, ListaLigada listaL) { this.mostrar = mostrar; this.completa = completa; this.listaL = listaL; } public void run() { String orden=""; mostrar.setText("No hay nada cocinandose"); while(true) { //if(listaL.estaVacia()==true) orden = listaL.eliminarInicio(); mostrar.setText(orden+" se está cocinando"); String cocinadaInfo = completa.esperarEvento(); mostrar.setText("no hay nada cocinandose"); } } } Clase 3 | Mesero import java.awt.*; import java.applet.Applet; import java.awt.event.*; public class Mesero extends Thread 4 { private Orden orden; private TextField mostrar; private ListaLigada listaL; public Mesero(TextField mostrar, Orden orden, ListaLigada listaL) { this.orden = orden; this.mostrar = mostrar; this.listaL = listaL; } public void run() { while(true) { String nuevaOrden = orden.esperarEvento(); mostrar.setText("Nueva orden: "+nuevaOrden); try { Thread.sleep(5000); } catch(InterruptedException e) { System.err.println("Excepcion"); } mostrar.setText("Esperando orden"); listaL.insertarFinal(nuevaOrden); } } } Clase 4 | Orden public class Orden { private String orden = ""; public synchronized void notificarEvento(String nuevaOrden) { 5 orden= nuevaOrden; notify(); } public synchronized String esperarEvento() { while(orden.equals("")) try { wait(); } catch(InterruptedException e) { System.err.println("Excepción"); } String nuevaOrden = orden; orden = ""; return nuevaOrden; } } Clase 5 | Lista Ligada import java.awt.*; import java.applet.Applet; import java.awt.event.*; public class ListaLigada { Nodo iniLista; TextArea mostrar; ListaLigada(TextArea mostrar) { this.mostrar = mostrar; iniLista = null; } public synchronized void insertarFinal(String dato) 6 { Nodo nuevo = new Nodo(dato); Nodo aux = iniLista; if(estaVacia()) iniLista = nuevo; else { while(aux.siguiente != null) { aux=aux.siguiente; } aux.siguiente=nuevo; } mostrar(); notify(); } public synchronized void insertarInicio(String dato) { Nodo aux = iniLista; Nodo nuevo = new Nodo(dato); if(estaVacia()) iniLista = nuevo; else { nuevo.siguiente=iniLista; iniLista = nuevo; } mostrar(); notify(); } public synchronized String eliminarFinal() { Nodo adelante, atras; adelante = atras = iniLista; String borrado; 7 while(iniLista == null) try { wait(); } catch(InterruptedException e) { System.err.println("Excepción"); } if(iniLista.siguiente == null) { borrado = iniLista.dato; iniLista = null; } else { while(adelante.siguiente != null) { atras=adelante; adelante = adelante.siguiente; } borrado = adelante.dato; atras.siguiente=null; } mostrar(); return borrado; } public synchronized String eliminarInicio() { while(iniLista == null) try { wait(); } catch(InterruptedException e) 8 { System.err.println("Excepción"); } String borrado = iniLista.dato; iniLista = iniLista.siguiente; mostrar(); return borrado; } void mostrar() { mostrar.setText("Lista de procesos: \n"); Nodo aux = iniLista; while(aux != null) { mostrar.append(aux.dato+"\n"); aux=aux.siguiente; } } boolean estaVacia() { return iniLista == null; } } Clase 6 | Nodo String import java.awt.*; import java.applet.Applet; import java.awt.event.*; public class Nodo { String dato; Nodo siguiente; 9 Nodo(String dato) { this.dato = dato; siguiente = null; } } Applet de programa Café con Listas Ligadas 10 Programa 2 | Poetas Este ejercicio consiste en agregar a un poeta más del programa de poetas en las páginas de las copias dejadas por la profesora. Revolucionario.java Poeta que tratara de imprimir su poema en la pantalla 11 Infantil.java Para que los poetas puedan imprimir sus poemas primero deben de pedir un permiso al controlador de pantalla 12 NuevoPoeta.java 13 ControladorDePantalla.java El controlador de Pantalla funciona como intermediario para que cada poeta pueda imprimir sus poemas en turnos 14 Poetas.java Programa ejecutado y compilado 15 CONCLUSIÓN La creación de APPLET´s por medio de hilos es una forma mejorada de trabajar con programas. Un detalle interesante es el paso de información entre hilos de ejecución. 16 BIBLIOGRAFÍA http://thales.cica.es/rd/Recursos/rd99/ed99-0444-03/creaHilos.html 17