Você está na página 1de 5

HILOS

Conceptos basicos.
Un hilo -algunas veces llamado contexto de ejecucin o proceso ligero- es un
flujo de control secuencial dentro de un programa. Un nico hilo es similar a un
programa secuencial; es decir, tiene un comienzo, una secuencia y un final, adems en
cualquier momento durante la ejecucin existe un slo punto de ejecucin. Sin embargo,
un hilo no es un programa; no puede correr por s mismo, corre dentro de un programa.
Un hilo por si mismo no nos ofrece nada nuevo. Es la habilidad de ejecutar varios hilos
dentro de un programa lo que ofrece algo nuevo y til; ya que cada uno de estos hilos
puede ejecutar tareas distintas.
El ambiente de desarrollo de Java soporta programacin con mltiples hilos por
medio de bibliotecas, el lenguaje mismo y con la ayuda del sistema de tiempo de
ejecucin. A continuacin se listan las caractersticas ms importantes con las que cuenta
Java para soportar el uso de hilos.
El mtodo run
Antes que nada, necesitamos proveer a cada hilo con un mtodo run para indicarle qu
debe hacer. El cdigo de este mtodo implementa el comportamiento en ejecucin del
hilo y puede hacer, prcticamente cualquier cosa capaz de ser codificada en Java.
Existen dos tcnicas para proveer un mtodo run para un hilo:
Haciendo una subclase de Thread y sobrecargando run

Implementando la interface Runnable. Thread es una clase, pero Runnable


es una interfase.

Por convencin para seleccionar cual tcnica vamos a usar seguiremos la siguiente regla:
``Si las clases que elaboras deben ser subclases de otras clases (un caso comn es Applet),
entonces debe usarse Runnable.''
Una vez que el hilo hace algo, podemos manejar el ciclo de vida de un hilo: como crear y
arrancar un hilo, algunas cosas especiales que podemos hacer mientras se ejecuta y como
detenerlo.
Manejo de Prioridades de los hilos
La gran ventaja que ofrecen los hilos (como se puede inferir de lo anteriormente
expuesto) es que corren de manera concurrente. Conceptualmente, esto es cierto, pero en
la prctica generalmente no es posible. La mayora de las computadoras tienen un slo
procesador, por lo tanto los hilos corren uno a la vez de forma tal que proveen la ilusin
de concurrencia (esto es llamado scheduling). El sistema de ejecucin de Java soporta un
algoritmo determinstico (para el scheduler) llamado fixed priority scheduling. Este
algoritmo asigna tiempo de ejecucin a un hilo basado en su prioridad relativa a los
dems hilos que estn listos para ejecutarse.
Cuando se crea un nuevo hilo, hereda su prioridad del hilo que lo crea, sta puede ser
modificada con el mtodo setPriority. Las prioridades son enteros entre

MIN_PRIORITY y MAX_PRIORITY (constantes definidas en la clase Thread). Entre


ms alto el entero, ms alta la prioridad. Si dos hilos con la misma prioridad estn
esperando que el CPU los ejecute, el scheduler escoge uno utilizando round-robin (i.e.
escoge de forma aleatoria, se supone que round-robin ofrece iguales probabilidades de
ejecucin a los hilos en cuestin). El hilo seleccionado para ejecucin, corre hasta que
alguna de estas condiciones sea verdadera:
Un hilo con mayor prioridad est listo para ejecucin.
El hilo cede su lugar (yields), o su mtodo run termina.
En sistemas que soportan rebanadas de tiempo (time slicing), su tiempo
asignado ha expirado.
En ese momento el segundo hilo es atendido por el CPU y as sucesivamente hasta que el
intrprete termina.
Sincronizacin.
Cuando tenemos varios hilos, muchas veces deseamos que stos pueden compartir datos,
por lo tanto, es indispensable saber sincronizar sus actividades; esto tambin nos
permitir evitar inanicin y abrazos mortales.
En muchas situaciones, hilos que se ejecutan concurrentemente comparten informacin y
deben considerar el estado de las actividades de los dems hilos.
Los segmentos de cdigo dentro de un programa que accedan el mismo objeto desde
hilos separados (concurrentes) se llaman regiones crticas.
Agrupamientos de hilos
Todo hilo en Java es miembro de un grupo. Un grupo de hilos nos da las
herramientas para meter varios hilos en un slo objeto y manipularlos (a todos) al mismo
tiempo. La clase ThreadGroup implementa los grupos de hilos en Java. El sistema de
ejecucin de Java pone a un hilo en un grupo durante la construccin del hilo. Cuando se
crea un hilo, uno puede escoger el grupo al que pertenecer o permitir que el sistema
seleccione un grupo razonable por omisin para nuestro nuevo hilo. El hilo as creado es
miembro permanente del grupo al cual se una durante su creacin -no puede ser
cambiado.
Si se crea un hilo sin especificar su grupo en el constructor, el sistema de ejecucin
automticamente pone el nuevo hilo en el mismo grupo que el hilo que lo crea. Cuando
una aplicacin de Java arranca, el sistema de ejecucin de Java crea un ThreadGroup
llamado main. A menos que se especifique lo contrario, todos los nuevos hilos que se
creen durante el desarrollo de la aplicacin sern miembros del grupo de hilos main.
La clase Thread provee tres constructores que te permiten asignar a un grupo al hilo que
ests creando. Finalmente la clase ThreadGroup provee un conjunto de mtodos que te
permiten obtener informacin como:
qu otros hilos pertenecen al mismo grupo,
modificar los hilos por grupo:
suspenderlos,

activarlos,
detenerlos, etc.
todo con una sola invocacin a los mtodos respectivos.
Creacin de un hilo.
Esta es solo una forma de hacerlo heredando de Thread
classMiThreadextendsThread{
publicvoidrun(){
...
}
El ejemplo anterior crea una nueva clase MiThread que extiende la clase Thread y
sobrecarga el mtodo Thread.run() por su propia implementacion.
La otra forma es utilizando la interface Runnable
publicclassMiThreadimplementsRunnable{
Threadt;
publicvoidrun(){
//Ejecucindelthreadunavezcreado
}
}
Arranque de un Thread
Las aplicaciones ejecutan main() tras arrancar. Esta es la razn de que main() sea el lugar
natural para crear y arrancar otros threads. La lnea de cdigo:
t1=newTestTh("Thread1",(int)
(Math.random()*2000));
crea un nuevo thread. Los dos argumentos representan el nombre del thread y el tiempo
que queremos que espere antes de imprimir el mensaje.
Al tener control directo sobre los threads, tenemos que arrancarlos explcitamente. En
nuestro ejemplo con:
t1.start();
start(), en realidad es un mtodo oculto en el thread que llama al mtodo run().

Suspensin de un Thread

Puede resultar til suspender la ejecucin de un thread sin marcar un lmite de


tiempo. Por ejemplo, para construir un applet con un thread de animacin, querr permitir
al usuario la opcin de detener la animacin hasta que quiera continuar. No se trata de
terminar la animacin, sino desactivarla. Para este tipo de control de thread se puede
utilizar el mtodo suspend().
t1.suspend();
Este mtodo no detiene la ejecucin permanentemente. El thread es suspendido
indefinidamente y para volver a activarlo de nuevo necesitamos realizar una invocacin
al mtodo resume():
t1.resume();
Parada de un Thread
El ltimo elemento de control que se necesita sobre threads es el mtodo stop(). Se utiliza
para terminar la ejecucin de un thread:
t1.stop();
Esta llamada no destruye el thread, sino que detiene su ejecucin. La ejecucin no se
puede reanudar ya con t1.start(). Cuando se desasignen las variables que se usan en el
thread, el objeto thread (creado con new) quedar marcado para eliminarlo y el garbage
collector se encargar de liberar la memoria que utilizaba.
En nuestro ejemplo, no necesitamos detener explcitamente el thread. Simplemente se le
deja terminar. Los programas ms complejos necesitarn un control sobre cada uno de los
threads que lancen, el mtodo stop() puede utilizarse en esas situaciones.
Si se necesita, se puede comprobar si un thread est vivo o no; considerando vivo un
thread que ha comenzado y no ha sido detenido.
t1.isAlive();
Este mtodo devolver true en caso de que el thread t1 est vivo, es decir, ya se haya
llamado a su mtodo run() y no haya sido parado con un stop() ni haya terminado el
mtodo run() en su ejecucin.

Ciclo de vida de un hilo

Un hilo puede estar en diferentes estados, por ejemplo, si un hilo esta en el estado
born (fig. 1) permanece ah hasta que se llama al mtodo start, que pone al hilo en el
estado de ready . El hilo que tenga la prioridad ms alta entra al estado de running (es
cuando el hilo comienza ha ejecutarse). El hilo entra al estado dead cuando el mtodo
run termina ya sea por que completo sus actividades o por cualquier otra razn.
Una manera comn de que un hilo entre al estado blocked es cuando un hilo
solicita entrada o salida de datos. En este caso el hilo entra al estado ready cuando la
entrada/salida se completa.
Cuando el programa llama al mtodo sleep de un hilo que esta corriendo, el hilo
entra al estado sleeping . Un hilo que se encuentra en este estado se cambia al estado
ready cuando expira el tiempo designado para dormir. Si el programa ejecuta el mtodo
interrupt de un hilo que se encuentra en el estado sleeping el hilo se sale de ese estado y
entra al estado ready.
Un hilo entra al estado dead cuando el mtodo run termina o cuando se lanza una
excepcin.

born

Notify o
nitifyAll

start

wait
sleep

wating
Termina intervalo
de dormir

Termina solicitud
entrada/salida

read
y

sleepin
g

runnin
g

Solicita entrada/salida

dead

bloked

Você também pode gostar