You are on page 1of 4

HILOS DEMONIO Los hilos de ejecucin demonio tambin se llaman servicios, porque se ejecutan, normalmente, con prioridad baja

proporcionan un ser!icio b"sico a un pro#rama o pro#ramas cuando la acti!idad de la m"quina es reducida$ Los hilos demonio son %tiles cuando un hilo debe ejecutarse en se#undo plano durante lar#os per&odos de tiempo$'n ejemplo de hilo demonio que est" ejecut"ndose continuamente es el recolector de basura (garbage collector)$ Este hilo, proporcionado por la M"quina *irtual +a!a, comprueba las !ariables de los pro#ramas a las que no se accede nunca libera estos recursos, de!ol!indolos al sistema$ 'n hilo puede ,ijar su indicador de demonio pasando un !alor true al mtodo setDaemon()$ Si se pasa ,alse a este mtodo, el hilo de ejecucin ser" de!uelto por el sistema como un hilo de usuario$ No obstante, esto %ltimo debe reali-arse antes de que se arranque el hilo de ejecucin (start())$ Si se quiere saber si un hilo es un hilo demonio, se utili-ar" el mtodo isDaemon()$
..Demonios$ja!a import ja!a$io$/0 class Demonio e1tends 2hread3 pri!ate static ,inal int 24M4NIO 5 670 pri!ate 2hread89 t 5 ne: 2hread824M4NIO90 public Demonio()3 setDaemon(true)0 start()0 ; public !oid run()3 ,or(int i 5 70 i<24M4NIO0 i==)3 t8i95 ne: EnjendrarDemonio(i)0 ; ,or(int i570 i<24M4NIO0 i==)3 S stem$out$println(>t8> = i = >9$isDaemon() 5 > = t8i9$isDaemon() )0 ; :hile(true) ield()0 ; ; class EnjendrarDemonio e1tends 2hread3 public EnjendrarDemonio(int i)3 S stem$out$println(>Enjendrando demonio > = i )0 start()0 ; public !oid run()3 :hile (true) ield()0 ; ; public class Demonios3 public static !oid main(Strin#89 ar#s) thro:s IOE1ception3 2hread d 5 ne: Demonio()0 S stem$out$println(>d$isDaemon() 5 > = d$isDaemon() )0 S stem$out$println(>presione cualquier tecla para terminar>)0 S stem$in$read()0 ; ;

Cambio de Contexto
Si e1iste una interrupcin pendiente es necesario? Sal!ar el conte1to (@A, re#istros del procesador, in,ormacin de la pila) del pro#rama en ejecucin$ @oner en el @A la direccin del pro#rama de tratamiento de la interrupcin, que suele constar de unas pocas tareas b"sicas$ 'na pre#unta que puede plantearse es? Bqu es lo que constitu e el conte1to que se debe sal!arC La respuesta es que se debe incluir in,ormacin que pueda ser necesaria para reanudar el pro#rama interrumpido$ 4s& pues, debe #uardarse la parte del bloque de control del proceso denominada in,ormacin de estado del procesador$ Esto inclu e al contador de pro#rama, otros re#istros del procesador la in,ormacin de la pila$ BSe tiene que hacer al#o m"sC Ello depender" de lo que ocurra a continuacin$ La rutina de tratamiento de la interrupcin es normalmente un pro#rama corto que lle!a a cabo unas pocas tareas b"sicas relacionadas con una interrupcin$ @or ejemplo, se marca el indicador que seDala la presencia de una interrupcin, puede en!iar un acuse de recibo a la entidad que produjo la interrupcin (como un mdulo de E.S) puede hacer al#unas tareas b"sicas relacionadas con los e,ectos del suceso que caus la interrupcin$ @or ejemplo, si la interrupcin est" relacionada con un suceso de E.S, el #estor de interrupciones comprobar" condiciones de error$ Si se ha producido un error, la rutina de tratamiento puede en!iar una seDal al proceso que solicit ori#inalmente la operacin de E.S$ BHa que hacer al#o m"sC @ues depende de si la interrupcin !a a !enir se#uida de un cambio de proceso o no$ La ocurrencia de una interrupcin no siempre causa el cambio de proceso$ Es posible que despus de que el #estor de interrupciones se ha a ejecutado, el proceso que estaba ejecut"ndose reanude su ejecucin$ En tal caso, tan slo ha que #uardar la in,ormacin de estado del procesador restaurarla para que pueda reanudarse correctamente el proceso interrumpido (estas ,unciones son reali-adas en hardware)$ @or tanto, el cambio de conte1to es un concepto distinto al cambio de un proceso$ @uede ocurrir un cambio de conte1to sin cambiar el estado del proceso que est" actualmente en estado de ejecucin$ En tal caso, sal!ar el conte1to restaurarlo posteriormente in!olucra un pequeDo coste e1tra$ Sin embar#o, si el proceso que estaba ejecut"ndose tiene que pasar a otro estado (listo o bloqueado), el sistema operati!o tiene que lle!ar a cabo cambios substanciales en su entorno( conte1to )$ Los pasos in!olucrados en un cambio completo de proceso son los si#uientes? 6$Sal!ar el conte1to del procesador, inclu endo el contador de pro#rama otros re#istros$

E$4ctuali-ar el @AF que estaba en estado de ejecucin$ Esto implica cambiar el estado del proceso a al#uno de los otros estados (listo, bloqueado, suspendidoGlisto)$ 2ambin se tienen que actuali-ar otros campos, como uno en el que se #uarde la ra-n por la que se abandona el estado de ejecucin otros con in,ormacin de contabilidad$ H$Mo!er el @AF a la cola apropiada (listos, bloqueados por el suceso i, suspendidoGlisto)$

I$Seleccionar otro proceso para ejecucin (como !eremos en el tema de Planificacin de Procesos)$ J$4ctuali-ar el @AF seleccionado$ Aambiar, por ejemplo, su estado a Ken ejecucinL$ M$4ctuali-ar las estructuras de datos de #estin de la memoria$ Esto puede hacer ,alta dependiendo de cmo se #estione la traduccin de direcciones (lo dejaremos para los temas sobre memoria)$Nestaurar el conte1to del procesador a aqul que e1ist&a en el momento en el que el proceso seleccionado dej por %ltima !e- el estado de en ejecucin, car#ando los !alores pre!ios del contador de pro#rama de otros re#istros$ 4s& pues, el cambio de proceso, que implica un cambio de conte1to, requiere un es,uer-o considerablemente superior al de un cambio de conte1to$

Que mata al hilo de forma brusca


Un hilo de ejecucin se puede morir de dos formas: por causas naturales o porque lo maten (con stop()). Tambin se puede matar en cualquier momento un hilo, invocando a su mtodo stop(). En el tro o de cdi!o si!uiente: Thread MiThread = new MiClaseThread(); MiThread.start(); try { MiThread.sleep( 10000 ); } catch( InterruptedExcepti n e ) { ; } MiThread.st p(); se crea " arranca el hilo MiThread, se duerme durante #$ se!undos " en el momento de despertarse, la llamada a su mtodo stop(), lo mata. El mtodo stop() env%a un objeto ThreadDeath al hilo de ejecucin que quiere detener. &s%, cuando un hilo es parado de este modo, muere as%ncronamente. El hilo morir' en el momento en que reciba ese objeto ThreadDeath. (os applets utili ar'n el mtodo stop() para matar a todos sus hilos cuando el nave!ador con soporte )ava en el que se est'n ejecutando le indica al applet que se deten!an, por ejemplo, cuando se minimi a la ventana del nave!ador o cuando se cambia de p'!ina.

El mtodo isAlive()
El interfa de pro!ramacin de la clase Thread inclu"e el mtodo isAlive(), que devuelve true si el hilo ha sido arrancado (con start()) " no ha sido detenido (con stop()). *or ello, si el mtodo isAlive() devuelve false, sabemos que estamos ante un Nuevo Thread o ante un thread Muerto. +i devuelve true, se sabe que el hilo se encuentra en estado Ejecutable o Parado. ,o se puede diferenciar entre Nuevo Thread " Muerto, ni entre un hilo Ejecutable o Parado.

Prioridades de hilo
El intrprete de +a!a utili-a prioridades para determinar cmo debe comportarse cada hilo con respecto a los dem"s$ Las prioridades de hilo son !alores entre 6 67 que indican la prioridad relati!a de un hilo con respecto a los dem"s$

Mtodo que devuelve verdadero si un hilo es hilo demonio


Si se quiere saber si un hilo es un hilo demonio, se utili-ar" el mtodo isDaemon()$

Mtodos para la sincronizacin


Si se utili-a una clase que no ,ue diseDada para accesos multihilo , por ello, dispone de mtodos no sincroni-ados que manipulan el estado interno, puede en!ol!er la llamada al mtodo en un bloque sincroni-ado$ El ,ormato #eneral de la sentencia sincroni-ada es el si#uiente? s nchroni-ed(objeto) sentencia0 En el ejemplo, objeto es cualquier re,erencia al objeto, sentencia suele ser un bloque que inclu e una llamada al mtodo de objeto, que solo tendr" lu#ar una !e- que el hilo ha a entrado con 1ito en el monitor de objeto$ +a!a proporciona un mecanismo ele#ante de comunicacin entre procesos, a tra!s de los mtodos :ait, noti, noti, 4ll$ Estos mtodos se implementan como mtodos de ,inal en Object, de manera que todas las clases disponen de ellos$ Aualquiera de los tres mtodos slo puede ser llamado desde dentro de un mtodo s nchroni-ed$

wait: le indica al hilo en curso que abandone el monitor se !a a a dormir hasta que otro hilo entre en el mismo monitor llame a noti, $ notify: despierta al primer hilo que reali- una llamada a :ait sobre el mismo objeto$ notifyAll : despierta todos los hilos que reali-aron una llamada a :ait sobre el mismo objeto$ El hilo con ma or prioridad de los despertados es el primero en ejecutarse$

You might also like