• LA CLASE THREAD – – – – CONSTRUCTORES METODOS METODOS SYNCHRONIZED ANULADOS SENTENCIAS SYNCHRONIZED • GRUPOS DE THREADS – CONSTRUCTORES – METODOS • INTERFACE RUNNABLE • EXCEPCIONES Constructores más usados de Thread public Thread ( String threadName) construye un thread cuyo nombre es threadName public Thread () construye un thread cuyo nombre es Thread concatenado con un dígito (Thread1, Thread2) public Thread(Runnable target) Target es el objeto cuyo método run se va a ejecutar Ing. E.D'Agostino INFORMATICA III- 2007 2 La clase Thread Métodos más importantes: public void start() Causa que este thread comience a ejecutarse; la MVJ llama al método run de este thread. public void run() activa el thread public final void join(long millis) throws InterruptedException espera por la terminación Ing. E.D'Agostino INFORMATICA III- 2007 3 La clase Thread public void interrupt() sale de un wait, sleep o join public boolean isInterrupted() determina si un hilo ha sido interrumpido public static void yield() cede el paso Ing. E.D'Agostino INFORMATICA III- 2007 4 La clase Thread public final void stop() Fuerza que el hilo detenga su ejecución public final void suspend() cuando se invoca pasa al estado suspendido public final void resume() abandona el estado suspendido public String toString() Retorna un String que representa al hilo Ing. E.D'Agostino INFORMATICA III- 2007 5 La clase Thread Métodos estáticos más interesantes: public static Thread currentThread() public static void sleep(long millis) throws InterruptedException Ing. E.D'Agostino INFORMATICA III- 2007 6 La clase Thread Métodos de la clase Object que controlan la suspensión del Thread actual: wait() (equivale a 0 milisegundos) wait (milisegundos) notify () notifyAll() Ing. E.D'Agostino INFORMATICA III- 2007 7 Wait y notify Sirven para comunicar los threads entre sí synchronized void cuandoCondicion ( ) { while ( ! condicion ) wait ( ); ….hacer lo que sea necesario cuando la condicion sea cierta } Ing. E.D'Agostino INFORMATICA III- 2007 8 Wait y notify synchronized void cambiaCondicion ( ) { ….cambiar algún valor usado en condición notify ( ) ; // notifyAll ( ) } Ing. E.D'Agostino INFORMATICA III- 2007 9 Wait y notify • Para que el contenido del objeto sea estable todo debe ocurrir en método synchronized. • Cuando se suspende el thread libera en forma atómica el bloqueo del objeto. • La prueba de la condición debe estar siempre en un bucle. Ing. E.D'Agostino INFORMATICA III- 2007 10 Wait • public final void wait (long timeout) throws InterruptedException • public final void wait (long timeout, int nanos) throws InterruptedException • public final void wait () throws InterruptedException Ing. E.D'Agostino INFORMATICA III- 2007 11 Notify • public final notify ( ) • public final notifyAll ( ) Ing. E.D'Agostino INFORMATICA III- 2007 12 PÉRDIDA DEL ESTADO DE EJECUCIÓN • Un thread deja su estado de ejecución por una de las siguientes causas: El método sleep se invoca. El thread llama al método wait y espera que una determinada condición se satisfaga. El thread está bloqueado por una I/O. El método suspend se invoca. Finaliza el quantum Ing. E.D'Agostino INFORMATICA III- 2007 13 Métodos synchonized anulados • Si una clase extendida anula un método synchronized, el nuevo método puede o no ser synchronized. • El método de la superclase continúa siendo synchronized. Ing. E.D'Agostino INFORMATICA III- 2007 14 Sentencias synchronized Permite ejecutar código sincronizado sin invocar un método sincronizado sentencia Ing. E.D'Agostino bloqueo INFORMATICA III- 2007 15 Sentencias synchronized Forma general: synchronized (expresión) sentencia Ing. E.D'Agostino Objeto a bloquear INFORMATICA III- 2007 16 Sentencias synchronized public static void abs (int [] values) { synchronized (values) { for (int i = 0; i< values; i++) { if (values [i] < 0) values [i] = -values[i]; } } } Ing. E.D'Agostino INFORMATICA III- 2007 17 Grupos de hilos • public class ThreadGroup extends Object • Un thread group representa un conjunto de hilos. Un thread group puede incluir también otros thread groups. Ing. E.D'Agostino INFORMATICA III- 2007 18 Grupos de hilos Tiene dos constructores: public ThreadGroup (String cadenanombre) construye un ThreadGroup cuyo nombre es cadenanombre public ThreadGroup ( ThreadGroup padre, String cadenanombre) construye un ThreadGroup hijo de padre, llamado cadenanombre Ing. E.D'Agostino INFORMATICA III- 2007 19 Grupos de hilos • La clase Thread tiene tres constructores que permiten crear un Thread y asociarlo a un grupo: – public Thread (ThreadGrroup threadGroup, String nombre) – public Thread (ThreadGrroup threadGroup, Runnable objetoEjecutable) – public Thread (ThreadGrroup threadGroup, Runnable objetoEjecutable, String cadena) Ing. E.D'Agostino INFORMATICA III- 2007 20 Métodos principales de ThreadGroup public int activeCount(); Retorna el numero de hilos activos public int activeGroupCount(); Retorna el numero de grupos activos Ing. E.D'Agostino INFORMATICA III- 2007 21 Métodos de ThreadGroup public final void checkAccess(); Determina si el thread actual tiene permiso para modificar el thread group. Si no tiene permiso lanza una excepción. public final void destroy() ; Destruye este thread group y todos sus subgrupos Ing. E.D'Agostino INFORMATICA III- 2007 22 Métodos de ThreadGroup public int enumerate(Thread list[]) • Copia en el arreglo cada thread activo de este thread public int enumerate(Thread list[], boolean recurse) • Igual al anterior. Si el argumento booleano es true copia las referencias a los thread que pertenecen a los subgrupos que forman parte del thread group. Si el arreglo es demasiado chico, los ignora sin avisar nada. Ing. E.D'Agostino INFORMATICA III- 2007 23 Métodos de ThreadGroup public final ThreadGroup getParent(); • Retorna el padre del ThreadGroup public final boolean isDaemon() • Testea si este thread group es daemon.Un daemon thread group se destruye automaticamente cuando el ultimo thread es parado o su ultimo thread group se destruye public void list(); • Imprime información sobre el grupo en la salida estandar.Es útil para public final boolean parentOf(ThreadGroup g); • Testea si el thread group es el thread group del argumento o uno de sus ancestros Ing. E.D'Agostino INFORMATICA III- 2007 24 Interface Runnable public interface Runnable • La interface Runnable debería ser implementada por cualquier clase cuyas instancias vayan a ser ejecutadas por un thread. La clase debe definir un metodo llamado run sin argumentos. Ing. E.D'Agostino INFORMATICA III- 2007 25 Excepciones que pueden ser lanzadas por métodos de threads • SecurityException (checkAccess) • IlegalArgumentException (setPriority) • IlegalThreadStateException (suspend/resume) • InterruptedException (otro thread quiere interrumpir el actual) Ing. E.D'Agostino INFORMATICA III- 2007 26 Threads y Swing • Thread inicial: crean un objeto Runnable que inicializa la interface gráfica del usuario. • Thread manejador de eventos: corren sobre este thread todo el código manejador de eventos. Evita la interferencia de threads. En general manejan tareas cortas • Thread trabajador: se utilizan para tareas que consumen mucho tiempo. Ing. E.D'Agostino INFORMATICA III- 2007 27 Thread anónimo ( new Thread() { public void run() { for(;;) System.out.println("Stop the world!"); } }).start(); Ing. E.D'Agostino INFORMATICA III- 2007 28 Problema Escribir un programa que gestione el prestamo de auriculares para recorrer un museo. Existe un almacenamiento unico de auriculares, pero varias colas desde donde se puden alquilar los auriculares. Simule la entrada de grupos visitantes que recorren el museo. Solo pueden alquilar auriculares si hay numero disponible de los mismos sino deben esperar que se desocupen. Ing. E.D'Agostino INFORMATICA III- 2007 29 Alquiler walkman public class AlquilerWalkman { static int numTotalwalkmans; public static int mostradores; public AlquilerWalkman() { super(); } Ing. E.D'Agostino INFORMATICA III- 2007 30 Alquiler walkman public static void main(String[] args) { if(args.length >=1) numTotalwalkmans = Integer.parseInt(args[0]); else numTotalwalkmans = 50; Museo m = new Museo (numTotalwalkmans); if(args.length >=2) mostradores = Integer.parseInt(args[1]); else mostradores = 3; for(int i=0; i<mostradores;i++) new Mostrador (m,i).start(); } } Ing. E.D'Agostino INFORMATICA III- 2007 31 Mostrador public class Mostrador extends Thread { int cola; Museo museo; public Mostrador() { super();} public Mostrador(String name) { super(name);} public Mostrador(Museo m, int q) { museo=m; cola=q;} Ing. E.D'Agostino INFORMATICA III- 2007 32 Mostrador public void run() { //cola es el numero de mostrador //w la cantidad de walkmans while (true) { int w =(int)(Math.random()*10); museo.alquilar(cola,w); new Visitantes (w, museo).start(); try{sleep(500);} //Mostrador permanece un rato inactiva hasta //atender un nuevo grupo catch(InterruptedException e){} } } Ing. E.D'Agostino INFORMATICA III- 2007 } 33 Museo import java.io.*; public class Museo { private static int walkmans; private static int caja; public Museo() { super();} public Museo(int w) { walkmans = w; caja = 0;} Ing. E.D'Agostino INFORMATICA III- 2007 34 Museo synchronized void alquilar(int c, int n) { //Si no quedan suficientes walkmans, //esperar a que se devuelvan en otro mostrador // y se nos notifique de ello //si las devoluciones no son suficientes //se espera hasta que asi sea. System.out.println("Mostrador " + c + "quiere " + n); while (walkmans < n){ try { wait();} catch (InterruptedException e){} } Ing. E.D'Agostino INFORMATICA III- 2007 35 Museo walkmans -=n; caja +=n; System.out.println("Mostrador " + c + "adquiere " + n); System.out.println(" Existencias :\n " + "Depositos en caja " + caja + " Total "+ (walkmans+caja) + " Walkmans disponibles "+walkmans); notify(); } Ing. E.D'Agostino INFORMATICA III- 2007 36 Visitantes public class Visitantes extends Thread { int tamanoGrupo; public Museo museo; public Visitantes() { super();} public Visitantes(int w, Museo m) { museo = m; tamanoGrupo = w;} Ing. E.D'Agostino INFORMATICA III- 2007 37 Visitantes public void run() { try{ sleep((int)(Math.random()*1000)+1); }catch(InterruptedException e){} //permanece dormida un rato simulando //que los visitantes recorren el museo //despues devuelve los walkmans museo.replace(tamanoGrupo); } Ing. E.D'Agostino INFORMATICA III- 2007 38 BIBLIOGRAFÍA • Como programar en java Deitel y Deitel. Pearson Educación • Java. Fundamentos de Programación Judy Bishop. Addison-Wesley • http://java.sun.com/docs/books/tutorial Ing. E.D'Agostino INFORMATICA III- 2007 39