Está en la página 1de 5

Hilos

CONCEPTOS DE HILO
Hilo (theread) llamado tambin proceso ligero o subproceso, es la unidad de ejecucin de un proceso y est asociado con una secuencia de instrucciones un conjunto de registros y una pila. Cuando se crea un proceso el S.O crea su primer hilo (hilo primario) en la cual puede, a su vez, crear hilos adicionales. Esto pone de manifiesto que un proceso no ejecuta, sino que es slo el espacio de direcciones donde reside el cdigo que es ejecutado mediante uno o ms hilos.

En un S.O tradicional. Cada proceso tiene un espacio de direcciones y un nico hilo de control por ejemplo, considere que un programa que incluya la siguiente secuencia de operaciones para actualizar el saldo de una cuenta bancaria cuando se efecta un nuevo ingreso: Saldo=Cuenta.ObtenerSaldo (); Saldo+=ingreso; Cuenta.EstablecerSaldo (saldo); Este modelo de programacin, en el que se ejecuta un solo hilo, es en el que estamos acostumbrados a trabajar habitualmente. Pero, siguiendo con el ejemplo anterior piensa en un banco real; en l varios cajeros pueden actuar simultneamente. Ejecutar el mismo programa por cada uno de los cajeros tiene un costo elevado (recuerde los recursos que necesita). En cambio si el programa permitiera lanzar un hilo por cada peticin de cada cajero para actualizar una cuenta, estaramos en el caso mltiples hilos ejecutndose concurrente mente (multitriandi) . Esta caracterstica ya es una realidad en los S.O modernos de hoy y como consecuencia contemplada en los lenguajes de programacin actuales.

Cada hilo se ejecuta de forma estrictamente secuencial y tiene su propia pila en estados de los registros de UCP y su propio contador de un programa en cambio comparte el mismo espacio de direcciones, lo que significa compartir tambin las mismas variables globales, el mismo conjunto de ficheros abiertos, procesos hijos (no hilos hijos), seales, semforos, etc. Los hilos comparten la UCP de la misma forma que lo hacen los procesos pueden crear hilos hijos y se pueden bloquear no obstante mientras un hilo del mismo proceso, en el caso de hilos soportados por el kernel (ncleo del S.O: programas en ejecucin que hacen que el sistema funcione), no sucediendo lo mismo con los hilos soportados por una aplicacin por ejemplo en Windows NT todos los hilos son soportados por el Kernel; imaginemos que alguien llaga a un

cajero para depositar dinero en una cuenta y casi al mismo tiempo un segundo cliente realiza la misma operacin sobre la misma cuanta en el segundo cajero quedara bloqueado hasta que el registro que est siendo actualizado por el primer cajero quede liberado.

ESTADOS DE UN HILO

Igual que los procesos con un solo hilo de control, los hilos pueden encontrarse en unos de los siguientes estados. NUEVO.- El hilo ha sido creado pero an no ha sido activado. Cuando se active pasar al estado preparado. PREPARADO.- El hilo est activado y le ha sido asignada la UCP. EN EJECUCIN.- El hilo est activo y le ha sido asignada la UCP(solo hilo activos preparados solo pueden ser ejecutados). BLOQUEADO.- El hilo espera que otro elimine el bloqueo de un hilo bloqueado. DORMIDO. -El hilo est bloqueado durante una cantidad de tiempo determinada despus de la cual despertar y pasar al estado preparado. ESPERANDO.-El hilo est esperando que ocurra alguna cosa:unacondicion,una operacin de E/S o adquirir la propiedad de un objeto sincronismo.Cuando ocurra, pasar al estado preparado. MUERTO.-El hilo ha finalizado (est muerto) pero todava no ha sido recogido por su padre. Los hilos muertos no pueden alcanzar ningn otro estado.

Descrito en lo anterior no se muestra los estados nuevo y muerto ya que no hay estados de transicin durante la vida del hilo; esto es, no se puede transitar al estado nuevo ni desde el estado muerto.

La transicin entre estados est controlada por un planificador: parte del ncleo del sistema operativo encargada que todos los hilos que esperan ejecutarse tengan su oportunidad. Si un hilo en ejecucin no puede continuar pasar al estado bloqueado; o tambin, si puede continuar y el planificador decide que ya ha sido ejecutado el tiempo suficiente, pasar al estado preparado. Si el proceso est bloqueado pasar a preparado cuando se d el evento por el que espera; puede estar esperando a que otro hilo elimine el bloqueo, o bien si est dormido, esperar a que pase el tiempo por el que fue enviado a este estado para ser activado; y si est preparado pasar a ejecucin cuando el planificador lo decida porque los dems hilos ya han tenido su parte de tiempo de UCP.

CUANDO SE DEBE CREAR UN HILO

Segn lo expuesto anteriormente, cada vez que se crea un proceso, el S.O crea un hilo primario. Para muchos procesos ste es el nico hilo necesario. Sin embargo, un proceso puede crear otros hilos para ayudarse en su trabajo, utilizando la UCP al mximo posible. Por ejemplo supongamos el diseo de una aplicacin procesador de texto. Sera acertado crear un hilo separado para manipular cualquier tarea de impresin? Este permitira al usuario continuar utilizando la aplicacin mientras se est imprimiendo el documento. En cambio, qu suceder si los datos del documento cambian mientras se imprime? ste es un problema que habra resolver, quizs creando un fichero temporal que contenga los datos a imprimir. Es evidente que los hilos son extraordinariamente tiles pero tambin es evidente que si no se utilizan adecuadamente pueden introducir nuevos problemas mientras tratamos de resolver otros ms antiguos. Por lo tanto, es un error pensar que la mejor forma de desarrollar una aplicacin es dividirla en partes que se ejecuten cada una como un hilo.

PROGRAMAR CON HILOS

La mayora del soporte de java proporciona para trabajar con hilos reside en la clase Theread del paquete java.lang, aunque tambin la clase Object, la interfaz Runnable, la interfaz Thread.UncaughtExceptionHandler y las clases ThreadGroup y ThreadLocal del mismo paquete, as como la mquina virtual, proporcionan algn tipo de soporte.

CREAR UN HILO
Los hilos de java se pueden crear en dos formas: escribiendo una nueva clase derivada de Theread, o bien haciendo una clase existente implementa la interfaz Runnable . La clase Thread, que implemente la interfaz Runnable, de forma resumida, est definida as: public class Thread extends Object implements Runnable { //Atributos static int MAX_PRIORITY;

//Prioridad mxima que un hilo puede tener. static int MIN_PRIORITY; //Prioridad mnima que un hilo puede tener. static int NORM_PRIORITY; //Prioridad asignada por omisin a un hilo. //Constructores Thread ([argumentos]) //Mtodos static Theread currentThread() //Devuelve una referencia al hilo que actualmente esta en ejecucin. long getID() //Devuelve el identificador del hilo. String getName() //Devuelve el nombre del hilo. int getPriority() //Devuelve la prioridad del hilo. void interrupt() //Enva este hilo al estado de preparado. boolean isAlive() //Verifica s este hilo est vivo (no ha terminado). boolean isDaemon() //Verifica s este hilo es un demonio. Se da este nombre a //un hilo se ejecuta en segundo plano, realizando una //operacin especfica en tiempos predefinidos, o bien en

//respuestas a ciertos eventos. boolean is Interrupted() //Verifica si este hilo ha sido interrumpido. void join([milisegundos[. nanosegundos]]) //Espera indefinidamente o el tiempo especificado,a que este //hilo termine (a que muera). void run() //Contiene el cdigo que es ejecutar cuando el hilo pase //al estado de ejecucin.Por omisin no hace nada. void setDaemon(boolean on) //Define este hilo como un demonio o como un hilo de usuario. void setName(String nombre) //Cambia el nombre de este hilo. void setPriority(int nuevaPrioridad) //Cambia la prioridad de este hilo.Por omisin es normal //(NORM_PRIORITY). static void sleep(long milisegundos[,int nanosegundos]) //Enva este hilo a dormir por el tiempo especificado. void start() //Inicia la ejecucin de este hilo:la mquina virtual de Java //invoca al mtodo run de este hilo. static void yield() //Detiene temporalmente la ejecucin de este hilo para //permitir la ejecucin de otros. //Mtodos heredados de la clase Object:notify,notifyAll y wait void notify() //Despierta un hilo de los que estn esperando por el //monitor de este objeto. void notifyAll() //Despierta todos los hilos que estn esperando por el //monitor de este objeto. void wait ([milisegundos[,nanosegundos]]) //Enva este hilo al estado de espera hasta que otro hilo //invoque al mtodo notify o notifyAll,o hasta que transcurra //el tiempo especificado. } Una clase que implemente la interfaz Runnable tiene que sobreescribir el mtodo run aportado por est, de ah que Thread proporcione este mtodo aunque no haga nada. El mtodo run contendr el cdigo que debe ejecutar el hilo. Los mtodos stop, suspend, resume, destroy y countStackFrames incluidos en versiones anteriores han sido desaprobados porque son intrnsecamente inseguros.

También podría gustarte