Está en la página 1de 33

Programacin Interactiva Hilos

Escuela de Ingeniera de Sistemas y Computacin Facultad de Ingeniera Universidad del Valle

THREADS: PROGRAMAS MULTITAREA

Los procesadores y los Sistemas Operativos modernos permiten la multitarea En la realidad, un ordenador con una sola CPU no puede realizar dos actividades a la vez. Sin em argo los Sistemas Operativos actuales son capaces de e!ecutar varios programas "simult#neamente" aun$ue slo se disponga de una CPU

THREADS: PROGRAMAS MULTITAREA

En ordenadores con dos o m#s procesadores la multitarea es real, ya $ue cada procesador puede e!ecutar un hilo o thread di%erente.

THREADS: PROGRAMAS MULTITAREA

Un proceso es un programa e!ecut#ndose de %orma independiente y con un espacio propio de memoria. Un Sistema Operativo multitarea es capaz de e!ecutar m#s de un proceso simult#neamente. Un thread o hilo es un flujo secuencial simple dentro de un proceso. Un &nico proceso puede tener varios hilos e!ecut#ndose.

THREADS: PROGRAMAS MULTITAREA


run'( )ait'( *Espera evento stop'( *+eadloc, start'( *Llama a run yield'( *-etorna control sleep'long ms( ./iempo +aemon . 0ac,ground no daemon * Por +e%ecto

java.lang.Thread java.lang.Runnable

CREACIN DE THREADS

En Java 1ay dos %ormas de crear nuevos threads. Crear una nueva clase $ue 1erede de la clase java.lang.Thread y so recargar el m2todo run(). 3, declarar una clase $ue implemente la inter%ace java.lang.Runnable, la cual declarar# el m2todo run()4 posteriormente se crea un o !eto de tipo Thread pas#ndole como argumento al constructor el o !eto creado de la nueva clase

Clase Thread
pu lic class Simple/1read extends Thread 5 pu lic Simple/1read 'String str( 5 66 constructor super'str(4 7 pu lic void run'( 5 66 rede%inicin del m2todo run'( %or'int i894i:;94i<<( System.out.println'"Este es el t1read = " < get>ame'((4 7 7 Simple/1read mi/1read 8 ne) Simple/1read'?Hilo de prue a@(4 mi/1read.start'(4

Inter%ace -unna le
pu lic class Simple-unna le im lements R!nna"le 5 String name/1read4 66 se crea una varia le 66 constructor pu lic Simple-unna le 'String str( 5 name/1read 8 str4 7 66 de%inicin del m2todo run'( pu lic void run'( 5 %or'int i894i:;94i<<( System.out.println'"Este es el t1read= " < name/1read(4 7 7

Inter%ace -unna le
Simple-unna le p 8 ne) Simple-unna le'"Hilo de prue a"(4 66 se crea un o !eto de la clase /1read pas#ndolo el o !eto -unna le como argumento /1read mi/1read 8 ne) /1read'p(4 66 se arranca el o !eto de la clase /1read mi/1read.start'(4

Inter%ace -unna le
class /1read-unna le eAtends Bpplet implements -unna le 5 private /1read runner8null4 66 se rede%ine el m2todo start'( de Bpplet pu lic void start'( 5 i% 'runner 88 null( 5 runner 8 ne) /1read'this(4 runner.start'(4 66 se llama al m2todo start'( de /1read 7 7 pu lic void stop'(5 66 se rede%ine el m2todo stop'( de Bpplet runner 8 null4 66 se li era el o !eto runner 7 7

Inter%ace -unna le
La eleccin de una u otra %orma .derivar de Thread o implementar Runnable. depende del tipo de clase $ue se vaya a crear. BsC, si la clase a utilizar ya 1ereda de otra clase 'por e!emplo un applet, $ue siempre 1ereda de Applet(, no $uedar# m#s remedio $ue implementar Runnable, aun$ue normalmente es m#s sencillo 1eredar de Thread.

Ciclo de Dida de un /1read

E!ecucin de un nuevo /1read

La creacin de un nuevo thread no implica necesariamente $ue se empiece a e!ecutar algo. Hace %alta iniciarlo con el m2todo start(), ya $ue de otro modo, cuando se intenta e!ecutar cual$uier m2todo del thread .distinto del m2todo start(). se o tiene en tiempo de e!ecucin el error IllegalThreadStateE ception.

0lo$ue /emporal de un /1read

E!ecutando el m2todo sleep() de la clase Thread. 'desde el m2todo run'(( E!ecutando el m2todo !ait() 1eredado de la clase "bject. Operaciones de Entrada6Salida o Input6Output 'E6S I6O(. Cuando el thread est# tratando de llamar a un m2todo s#nchroni$ed de un o !eto, y dic1o o !eto est# lo$ueado por otro thread Re#! era#i$n : n%ti&'( n%ti&'All

sleep'(
pu lic static void sleep'long millis( t1ro)s InterruptedEAception pu lic static void sleep'long millis, int nanosecons( t1ro)s InterruptedEAception System.out.println '"Contador de segundos"(4 int count894 pu lic void run '( 5 try 5 sleep';999(4 System.out.println'count<<(4 7 catc1 'InterruptedEAception e(57 7

+etener un /1read
La %orma pre%eri le de detener temporalmente un thread es la utilizacin con!unta de los m2todos !ait() y notif#All(). La principal venta!a del m2todo !ait() %rente a los m2todos anteriormente descritos es $ue li era el lo$ueo del o !eto. por lo $ue el resto de t1reads $ue se encuentran esperando para actuar so re dic1o o !eto pueden llamar a sus m2todos.

)ait'(
Hay dos %ormas de llamar a !ait()=
pu lic %inal void )ait'( t1ro)s InterruptedEAception

Sin argumentos, en cuyo caso el thread permanece parado 1asta $ue sea reinicializado eAplCcitamente mediante los m2todos notif#() o notif#All().

)ait'(
pu lic %inal void )ait'long timeout( t1ro)s InterruptedEAception pu lic %inal void )ait'long timeout, int nanos( t1ro)s InterruptedEAception

Indicando el tiempo m#Aimo $ue de e estar parado 'en milisegundos y con la opcin de indicar tam i2n nanosegundos(, de %orma an#loga a sleep(). B di%erencia del m2todo sleep(), $ue simplemente detiene el thread el tiempo indicado, el m2todo !ait() esta lece el tiempo m#Aimo $ue de e estar parado.

Einalizacin de un /1read
pu lic class FyBpplet eAtends Bpplet implements -unna le 5 private /1read Bpplet/1read4 66 se crea una re%erencia tipo /1read pu lic void start'( 5 66 m2todo start'( del Bpplet i%'Bpplet/1read 88 null(5 66 si no tiene un o ! /1read asociado Bpplet/1read 8 ne) /1read't1is, "El propio Bpplet"(4 Bpplet/1read.start'(4 66arranca el t1read y llama a run'( 7 7 pu lic void stop'( 5 66 m2todo stop'( del Bpplet Bpplet/1read 8 null4 66 iguala la re%erencia a null 7

Einalizacin de un /1read
pu lic class FyBpplet eAtends Bpplet implements -unna le 5 .... pu lic void run'( 5 66 m2todo run'( por implementar -unna le /1read my/1read 8 /1read.current/1read'(4 )1ile 'my/1read 88 Bpplet/1read( 5 661asta Gstop'( de /1read ... 7 7 7 66 %in de la clase FyBpplet

Sincronizacin

La sincroni$aci%n nace de la necesidad de evitar $ue dos o m#s threads traten de acceder a los mismos recursos al mismo tiempo. BsC, por e!emplo, si un thread tratara de escri ir en un %ic1ero, y otro thread estuviera al mismo tiempo tratando de orrar dic1o %ic1ero, se producirCa una situacin no deseada. Otra situacin en la $ue 1ay $ue sincronizar threads se produce cuando un thread de e esperar a $ue est2n preparados los datos $ue le de e suministrar el otro thread.

Sincronizacin
pu lic s'n#hr%ni)ed void metodoSincronizado'( 5 ...66 accediendo por e!emplo a las varia les de un o !eto ... 7

HCu#l es el pro lema con las varia lesI HJu2 pasan si son pu licas, privadas o protegidasI H+os metodos sincronizados pueden acceder al mismo o !etoI HCmo lo soluciona KavaI

Sincronizacin

Fetodos sincronizados

s#nchroni$ed Un metodo s#nchroni$ed static +entro de Sincronizacion, esperar aun$ue no 1aya pro lema +entro de Sincronizacion, +es lo$uea el o !eto.

Clases sincronizadas

Sleep'(

Lait'(

Sincronizacin get'(
pu lic sync1ronized int get'( 5 )1ile 'availa le 88 %alse( 5 try 5 66 Espera a $ue set'( asigne el valor y lo comuni$ue con 66 noti%y'( )ait'(4 7 catc1 'InterruptedEAception e( 5 7 7 availa le 8 %alse4 noti%yBll'(4 66 noti%ica $ue el valor 1a sido leCdo return contents4 66 devuelve el valor 7

Sincronizacin set'(
pu lic sync1ronized void set'int value( 5 )1ile 'availa le 88 true( 5 try 5 66 Espera a $ue get'( lea el valor disponi le antes de darle 66 otro )ait'(4 7 catc1 'InterruptedEAception e( 5 7 7 contents 8 value4 66 o%rece un nuevo valor y lo declara disponi le availa le 8 true4 66 noti%ica $ue el valor 1a sido cam iado noti%yBll'(4 7

Sincronizacin 'una parte(


pu lic void run'( 5 )1ile'true( 5 ... syncronized't1is( 5 66 sincroniza el propio t1read ... 66 Cdigo sincronizado 7 try 5 sleep'M99(4 66 Se detiene el t1read durante 9.M segundos 66 pero el o !eto es accesi le por otros t1reads al no estar sincronizado 7 catc1'InterruptedEAception e( 57 7

Prioridades

Con el %in de conseguir una correcta e!ecucin de un programa se esta lecen prioridades en los threads, de %orma $ue se produzca un reparto m#s e%iciente de los recursos disponi les.
&A'()RI"RIT* &I-()RI"RIT* (+) -"R&A.()RI"RIT* (/) (+,) get)riorit#() set)riorit#()

Nrupos de /1reads

Nrupos de /1reads

/odo 1ilo de Java de e %ormar parte de un grupo de 1ilos 'Thread0roup(. Puede pertenecer al grupo por de%ecto o a uno eAplCcitamente creado por el usuario. Los grupos de threads proporcionan una %orma sencilla de mane!ar m&ltiples threads como un solo o !eto. BsC, por e!emplo es posi le parar varios threads con una sola llamada al m2todo correspondiente. Una vez $ue un thread 1a sido asociado a un threadgroup, no puede cam iar de grupo.

Nrupos de /1reads

Cuando se arranca un programa, el sistema crea un Thread0roup llamado main. Si en la creacin de un nuevo thread no se especi%ica a $u2 grupo pertenece, autom#ticamente pasa a pertenecer al threadgroup del thread desde el $ue 1a sido creado 'conocido como current thread group y current thread, respectivamente(. Si en dic1o programa no se crea ning&n Thread0roup adicional, todos los threads creados pertenecer#n al grupo main 'en este grupo se encuentra el m2todo main()(.

Nrupos de /1reads

Para conseguir $ue un thread pertenezca a un grupo concreto, 1ay $ue indicarlo al crear el nuevo thread, seg&n uno de los siguientes constructores=

pu lic /1read '/1readNroup grupo, -unna le destino( pu lic /1read '/1readNroup grupo, String nom re( pu lic /1read '/1readNroup grupo, -unna le destino, String nom re(

Nrupos de /1reads

B su vez, un Thread0roup de e pertenecer a otro Thread0roup. Como ocurrCa en el caso anterior, si no se especi%ica ninguno, el nuevo grupo pertenecer# al Thread0roup desde el $ue 1a sido creado 'por de%ecto al grupo main(. La clase Thread0roup tiene dos posi les constructores=

/1readNroup'/1readNroup parent, String nom re(4 /1readNroup'String name(4

Nrupos de /1reads
get&a )riorit#(), set&a )riorit#(), get-ame(), get)arent(), parent"f(). /1readNroup mi/1readNroup 8 ne) /1readNroup'"Fi Nrupo de /1reads"(4 /1read mi/1read 8 ne) /1read'mi/1readNroup, @un t1read para mi grupo"(4

También podría gustarte