Está en la página 1de 4

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

y proporcionan un servicio bsico a un programa o programas cuando la actividad de la mquina es reducida. Los hilos demonio son tiles cuando un hilo debe ejecutarse en segundo plano durante largos perodos de tiempo.Un ejemplo de hilo demonio que est ejecutndose continuamente es el recolector de basura (garbage collector). Este hilo, proporcionado por la Mquina Virtual Java, comprueba las variables de los programas a las que no se accede nunca y libera estos recursos, devolvindolos al sistema. Un hilo puede fijar su indicador de demonio pasando un valor true al mtodo setDaemon(). Si se pasa false a este mtodo, el hilo de ejecucin ser devuelto por el sistema como un hilo de usuario. No obstante, esto ltimo debe realizarse antes de que se arranque el hilo de ejecucin (start()). Si se quiere saber si un hilo es un hilo demonio, se utilizar el mtodo isDaemon().
//Demonios.java import java.io.*; class Demonio extends Thread{ private static final int TAMANIO = 10; private Thread[] t = new Thread[TAMANIO]; public Demonio(){ setDaemon(true); start(); } public void run(){ for(int i = 0; i<TAMANIO; i++){ t[i]= new EnjendrarDemonio(i); } for(int i=0; i<TAMANIO; i++){ System.out.println("t[" + i + "].isDaemon() = " + t[i].isDaemon() ); } while(true) yield(); } } class EnjendrarDemonio extends Thread{ public EnjendrarDemonio(int i){ System.out.println("Enjendrando demonio " + i ); start(); } public void run(){ while (true) yield(); } } public class Demonios{ public static void main(String[] args) throws IOException{ Thread d = new Demonio(); System.out.println("d.isDaemon() = " + d.isDaemon() ); System.out.println("presione cualquier tecla para terminar"); System.in.read(); } }

Cambio de Contexto
Si existe una interrupcin pendiente es necesario: Salvar el contexto (PC, registros del procesador, informacin de la pila) del programa en ejecucin. Poner en el PC la direccin del programa de tratamiento de la interrupcin, que suele constar de unas pocas tareas bsicas. Una pregunta que puede plantearse es: qu es lo que constituye el contexto que se debe salvar? La respuesta es que se debe incluir informacin que pueda ser necesaria para reanudar el programa interrumpido. As pues, debe guardarse la parte del bloque de control del proceso denominada informacin de estado del procesador. Esto incluye al contador de programa, otros registros del procesador y la informacin de la pila. Se tiene que hacer algo ms? Ello depender de lo que ocurra a continuacin. La rutina de tratamiento de la interrupcin es normalmente un programa corto que lleva a cabo unas pocas tareas bsicas relacionadas con una interrupcin. Por ejemplo, se marca el indicador que seala la presencia de una interrupcin, puede enviar un acuse de recibo a la entidad que produjo la interrupcin (como un mdulo de E/S) y puede hacer algunas tareas bsicas relacionadas con los efectos del suceso que caus la interrupcin. Por ejemplo, si la interrupcin est relacionada con un suceso de E/S, el gestor de interrupciones comprobar condiciones de error. Si se ha producido un error, la rutina de tratamiento puede enviar una seal al proceso que solicit originalmente la operacin de E/S. Hay que hacer algo ms? Pues depende de si la interrupcin va a venir seguida 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 gestor de interrupciones se haya ejecutado, el proceso que estaba ejecutndose reanude su ejecucin. En tal caso, tan slo hay que guardar la informacin de estado del procesador y restaurarla para que pueda reanudarse correctamente el proceso interrumpido (estas funciones son realizadas en hardware). Por tanto, el cambio de contexto es un concepto distinto al cambio de un proceso. Puede ocurrir un cambio de contexto sin cambiar el estado del proceso que est actualmente en estado de ejecucin. En tal caso, salvar el contexto y restaurarlo posteriormente involucra un pequeo coste extra. Sin embargo, si el proceso que estaba ejecutndose tiene que pasar a otro estado (listo o bloqueado), el sistema operativo tiene que llevar a cabo cambios substanciales en su entorno( contexto ). Los pasos involucrados en un cambio completo de proceso son los siguientes: 1.Salvar el contexto del procesador, incluyendo el contador de programa y otros registros. 2.Actualizar el PCB que estaba en estado de ejecucin. Esto implica cambiar el estado del proceso a alguno de los otros estados (listo, bloqueado, suspendido_listo). Tambin se tienen que actualizar otros campos, como uno en el que se guarde la razn por la que se abandona el estado de ejecucin y otros con informacin de contabilidad. 3.Mover el PCB a la cola apropiada (listos, bloqueados por el suceso i, suspendido_listo).

4.Seleccionar otro proceso para ejecucin (como veremos en el tema de Planificacin de Procesos). 5.Actualizar el PCB seleccionado. Cambiar, por ejemplo, su estado a en ejecucin. 6.Actualizar las estructuras de datos de gestin de la memoria. Esto puede hacer falta dependiendo de cmo se gestione la traduccin de direcciones (lo dejaremos para los temas sobre memoria).Restaurar el contexto del procesador a aqul que exista en el momento en el que el proceso seleccionado dej por ltima vez el estado de en ejecucin, cargando los valores previos del contador de programa y de otros registros. As pues, el cambio de proceso, que implica un cambio de contexto, requiere un esfuerzo considerablemente superior al de un cambio de contexto.

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 trozo de cdigo siguiente: Thread MiThread = new MiClaseThread(); MiThread.start(); try { MiThread.sleep( 10000 ); } catch( InterruptedException e ) { ; } MiThread.stop(); se crea y arranca el hilo MiThread, se duerme durante 10 segundos y en el momento de despertarse, la llamada a su mtodo stop(), lo mata. El mtodo stop() enva un objeto ThreadDeath al hilo de ejecucin que quiere detener. As, cuando un hilo es parado de este modo, muere asncronamente. El hilo morir en el momento en que reciba ese objeto ThreadDeath. Los applets utilizarn el mtodo stop() para matar a todos sus hilos cuando el navegador con soporte Java en el que se estn ejecutando le indica al applet que se detengan, por ejemplo, cuando se minimiza la ventana del navegador o cuando se cambia de pgina.

El mtodo isAlive()
El interfaz de programacin de la clase Thread incluye el mtodo isAlive(), que devuelve true si el hilo ha sido arrancado (con start()) y no ha sido detenido (con stop()). Por ello, si el mtodo isAlive() devuelve false, sabemos que estamos ante un Nuevo Thread o ante un thread Muerto. Si devuelve true, se sabe que el hilo se encuentra en estado Ejecutable o Parado. No se puede diferenciar entre Nuevo Thread y Muerto, ni entre un hilo Ejecutable o Parado.

Prioridades de hilo
El intrprete de Java utiliza prioridades para determinar cmo debe comportarse cada hilo con respecto a los dems. Las prioridades de hilo son valores entre 1 y 10 que indican la prioridad relativa de un hilo con respecto a los dems.

Mtodo que devuelve verdadero si un hilo es hilo demonio


Si se quiere saber si un hilo es un hilo demonio, se utilizar el mtodo isDaemon().

Mtodos para la sincronizacin


Si se utiliza una clase que no fue diseada para accesos multihilo y, por ello, dispone de mtodos no sincronizados que manipulan el estado interno, puede envolver la llamada al mtodo en un bloque sincronizado. El formato general de la sentencia sincronizada es el siguiente: synchronized(objeto) sentencia; En el ejemplo, objeto es cualquier referencia al objeto, y sentencia suele ser un bloque que incluye una llamada al mtodo de objeto, que solo tendr lugar una vez que el hilo haya entrado con xito en el monitor de objeto. Java proporciona un mecanismo elegante de comunicacin entre procesos, a travs de los mtodos wait, notify y notifyAll. Estos mtodos se implementan como mtodos de final en Object, de manera que todas las clases disponen de ellos. Cualquiera de los tres mtodos slo puede ser llamado desde dentro de un mtodo synchronized.

wait: le indica al hilo en curso que abandone el monitor y se vaya a dormir hasta que otro hilo entre en el mismo monitor y llame a notify. notify: despierta al primer hilo que realiz una llamada a wait sobre el mismo objeto. notifyAll_: despierta todos los hilos que realizaron una llamada a wait sobre el mismo objeto. El hilo con mayor prioridad de los despertados es el primero en ejecutarse.

También podría gustarte