Sei sulla pagina 1di 22

Programacin Multihilos

en Java
16/05/11 Programacin avanzada y mtodos numricos 2
Programacin concurrente

Se refiere a la programacin de tareas que


pueden ejecutarse paralelamente.
Tiempo
Reproducir
msica
Descargar
pelcula
Editar
archivo
Imprimir
16/05/11 Programacin avanzada y mtodos numricos 3
Hilos de ejecucin

Unidad de ejecucin asociada a una secuencia


de instrucciones

A la capacidad de un lenguaje de soportar la


programacin de varios hilos de ejecucin se
le denomina programacin multihilos
16/05/11 Programacin avanzada y mtodos numricos 4
Ciclo de vida de un hilo
16/05/11 Programacin avanzada y mtodos numricos 5
Estados de un hilo

En espera: el hilo no est siendo ejecutado y


espera a que otro hilo notifique que ya puede
ejecutarse

ormido: espera a que pase un cierto tiempo o


que otro hilo notifique que ya puede ejecutarse

!"o#ueado: entra a este estado cuando


espera que otra tarea termine de ejecutarse
(e. g. una operacin de entrada/salida)
16/05/11 Programacin avanzada y mtodos numricos 6
Estados de un hilo

$ctivo: el hilo se anda ejecutando este


estado se su!divide en dos"

Preparado: #l hilo se coloca en una fila de espera


para ser ejecutado por el procesador

En e%ecucin: #l hilo est siendo despachado por


el procesador

&uerto: #l hilo termina su ejecucin


16/05/11 Programacin avanzada y mtodos numricos '
Maneras de crear un hilo
$)%reando una su!clase de ()read
&)'mplementando la interfa( *unna+"e en una
clase
16/05/11 Programacin avanzada y mtodos numricos ,
Crear un hilo: forma 1
$.'mplementar una su!clase de Thread
&.So!recargar el m)todo heredado run(). #l
m)todo run() es el que se ejecuta en el hilo
de ejecucin
*.'nstanciar un o!jeto de esta clase y ejecutar
su m)todo start() con este m)todo el hilo
entra a su estado activo
16/05/11 Programacin avanzada y mtodos numricos -
class Hilo extends Thread {

// Sobrecarta de este mtodo here-
// dado de Thread
public void run() {
System.out.println(Hilo
ejecutndose.);
}
}
16/05/11 Programacin avanzada y mtodos numricos 10
class Prorama {
pu!lic static "oid main(Strin#$
ars) {
Hilo h1 = new Hilo();
Hilo h% & ne' Hilo();
h1.start();
h%.start();
}
}
16/05/11 Programacin avanzada y mtodos numricos 11
Crear un hilo: forma 2
$.'mplementar la interfa( (unna!le en una
clase e implementar el m)todo run() de esa
interfa(
&.'nstanciar un o!jeto de la clase Thread
pasndole como argumento un o!jeto de la
clase que implementa a (unna!le
*.+andar a llamar el m)todo start() del
o!jeto de la clase Thread que contiene al
o!jeto que implementa a (unna!le
16/05/11 Programacin avanzada y mtodos numricos 12
class Hilo implements Runnable {
// Mtodo especificado en Runnable
public void run() {
System.out.println(Hilo
ejecutndose.);
}
}
16/05/11 Programacin avanzada y mtodos numricos 13
class Prorama {
pu!lic static "oid main(Strin#$
ars) {
Hilo h1 & new Hilo();
Hilo h% & ne' Hilo();
Thread hilo1 = new Thread(h1);
Thread hilo) & ne' Thread(h%)
hilo1.start();
Hilo%.start();
}
}
16/05/11 Programacin avanzada y mtodos numricos 14
Elementos para sincronizacin

Secciones cr,ticas

+)todo 'ait()

+)todos noti*y() y noti*y+ll()

+)todo sleep()

+)todo join()
16/05/11 Programacin avanzada y mtodos numricos 15
ecciones cr!ticas

Secciones del cdigo a las que solo un hilo puede


acceder a la ve(
class ,u**er {
-- ...
pu!lic synchronized int ad.uirir(int i) {
-- Secci/n cr0tica
}
}
16/05/11 Programacin avanzada y mtodos numricos 16
Monitor

#n -ava cada o!jeto tiene un monitor o cerrojo


(lock) para facilitar un mecanismo
denominado exclusin mutua

Exclusin mutua es cuando un hilo e.cluye a


otros de acceder a datos compartidos

%on el monitor se puede !loquear y


des!loquear una seccin crtica del cdigo
16/05/11 Programacin avanzada y mtodos numricos 1'
M"todos #ait$ notif% % notif%&ll

/ermiten sincroni(ar tareas entre las cuales


e.iste dependencia

0ait() pone al hilo en espera hasta que la


seccin cr,tica queda des!loqueada

notify() notifica a un hilo (elegido


ar!itrariamente) que una seccin cr,tica ha sido
li!erada y este pasa a activo

notifyAll() notifica a todos los hilos que una


seccin cr,tica ha sido des!loqueada y )stos
pasan a activo
16/05/11 Programacin avanzada y mtodos numricos 1,
pu!lic synchronized "oid metodo() {
/* Como monitor, puede servir una variable
boolean que est compartida por los hilos a
sincronizar */
'hile(1monitor2isponi!le) {
try {
wait(); // n espera
} catch(3nterrupted45ception e) {}
}
notiy!ll(); /* notifica a los dem!s hilos
que la secci"n cr#tica ha sido desbloqueada
*/
}
16/05/11 Programacin avanzada y mtodos numricos 1-
M"todo sleep

/or medio del m)todo sleep() de la clase


Thread se manda al hilo a su estado dormido
durante un tiempo determinado. #ste m)todo
de!e ser llamado dentro de run()
pu!lic "oid run() {
Thread.sleep("###); // Recibe un
tiempo en milise$undos
}
16/05/11 Programacin avanzada y mtodos numricos 20
M"todo join

+anda al hilo que lo invoca al estado


!loqueado mientras que otro hilo espec,fico
termina de ejecutarse.

%uando ese otro hilo termina de ejecutarse el


hilo que invoc a join() pasa al estado
activo y continua su ejecucin

#ste m)todo tira una e.cepcin de clase


.nterruptedE/ception
16/05/11 Programacin avanzada y mtodos numricos 21
class Hilo implements (unna!le {
Thread h; /* %tro hilo, creado & puesto en
e'ecuci"n en al$(n otro punto del sistema */
pu!lic "oid run() {
try {
h.$oin(); /* l hilo de este mtodo run)*
se bloquea hasta que el hilo h se termina de
e'ecutar */ }
catch(3nterrupted45ception e) { }
/* +espus de que h se termina de
e'ecutarse, se imprime este mensa'e */
System.out.println(Hilo en ejecuci/n.);
}
}
16/05/11 Programacin avanzada y mtodos numricos 22
Consultas y ayuda:
Ing. Diego Enrique Hernndez
Gonzlez
di_hernandez@uxmcc2.iimas.unam.mx

Potrebbero piacerti anche