Multithreadsegundapa..

Anuncio
• 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
Descargar