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.