Вы находитесь на странице: 1из 12

CIENCIAS DE LA COMPUTACIN

PROGRAMACIN II
INTEGRANTES
MILTON NICOLAY CHASILLACTA CANENCIA

NRC
4556OCTUBRE 2014 - FEBRERO 2015
QUITO - ECUADOR

RESUMEN HILOS
Pgina Web:
https://sites.google.com/a/espe.edu.ec/programacion-ii/

La importancia de los Hilos


Los hilos son otra forma de crear la posibilidad de concurrencia de actividades; sin embargo,
la gran diferencia es que los hilos comparten el cdigo y el acceso a algunos datos en forma
similar a como un objeto tiene acceso a otros objetos. En Java un hilo es un objeto con
capacidad de correr en forma concurrente el mtodo run(). En cierta manera es como tener
dos "program counters" para un mismo cdigo. Una diferencia con los procesos es que carece
de sentido y no es posible en este enfoque hacer mutar un proceso con algo similar a exec().
Definicin Thread
Una thread es un nico flujo de control dentro de un programa. Algunas veces es llamado
contexto de ejecucin porque cada thread debe tener sus propios recursos, como el program
counter y el stack de ejecucin, como el contexto de ejecucin. Sin embargo, toda thread en
un programa an comparte muchos recursos, tales como espacio de memoria y archivos
abiertos. Threads tambin son llamadas procesos livianos (lightweight process).
NOTA: Es mucho ms simple crear y destruir una thread que un proceso.

Creacin y control de Threads


La clase Thread
Es la clase que encapsula todo el control necesario sobre los hilos de ejecucin (threads). Hay
que distinguir claramente un objeto Thread de un hilo de ejecucin o thread. Esta distincin
resulta complicada, aunque se puede simplificar si se considera al objeto Thread como el
panel de control de un hilo de ejecucin (thread). La clase Thread es la nica forma de
controlar el comportamiento de los hilos y para ello se sirve de los mtodos que se exponen en
las secciones siguientes.
Hay dos formas de hacer una tarea correr concurrentemente con otra: crear una nueva clase
como subclase de la clase Thread o declarar una clase e implementar la interfaz Runnable.

Uso de Subclase
Cuando se crea una subclase de Thread, la subclase debera definir su propio mtodo run()
para sobre montar el mtodo run() de la clase Thread. La tarea concurrente es desarrollada
en este mtodo run().
Ejecucin

del

mtodo

run()

Una instancia de la subclase es creada con new, luego llamamos al mtodo start() de la thread
para hacer que la mquina virtual Java ejecute el mtodo run(). Ojo para iniciar la
concurrencia invocamos a start(), as invocamos a run() en forma indirecta. Si invocamos a
run() directamente, se comportar como el llamado a cualquier mtodo llamado dentro de un
mismo hilo (sin crear uno independiente).
Implementacin

de

la

Interfaz

Runnable

La interfaz Runnable requiere que slo un mtodo sea implementado, el mtodo run().
Primero creamos una instancia de esta clase con new, luego creamos una instancia de Thread

con otra sentencia new y usamos el objeto recin creado en el constructor. Finalmente,
llamamos el mtodo start() de la instancia de Thread para iniciar la tarea definida en el
mtodo run().
RunnableThread.java
Una instancia de una clase que defina el mtodo run() - ya sea como subclase de Thread o
implementando la interfaz Runnable - debe ser pasada como argumento en la creacin de una
instancia de Thread. Cuando el mtodo start() de esta instancia es llamado, Java run time
sabe qu mtodo run() ejecutar.
Control de la Ejecucin de una Thread
Varios mtodos de la clase java.lang.Thread controlan la ejecucin de una thread.
Mtodos de Clase
Estos son los mtodos estticos que deben llamarse de manera directa en la clase Thread.
currentThread()
Este mtodo devuelve el objeto thread que representa al hilo de ejecucin que se est
ejecutando actualmente.
yield()
Este mtodo hace que el intrprete cambie de contexto entre el hilo actual y el siguiente hilo
ejecutable disponible. Es una manera de asegurar que nos hilos de menor prioridad no sufran
inanicin.
sleep( long )
El mtodo sleep() provoca que el intrprete ponga al hilo en curso a dormir durante el nmero
de milisegundos que se indiquen en el parmetro de invocacin. Una vez transcurridos esos
milisegundos, dicho hilo volver a estar disponible para su ejecucin. Los relojes asociados a
la mayor parte de los intrpretes de Java no sern capaces de obtener precisiones mayores de
10 milisegundos, por mucho que se permita indicar hasta nanosegundos en la llamada
alternativa a este mtodo.

Mtodos de Instancia
Aqu no estn recogidos todos los mtodos de la clase Thread, sino solamente los ms
interesantes, porque los dems corresponden a reas en donde el estndar de Java no est
completo, y puede que se queden obsoletos en la prxima versin del JDK, por ello, si se
desea completar la informacin que aqu se expone se ha de recurrir a la documentacin del
interfaz de programacin de aplicacin (API) del JDK.
start()
Este mtodo indica al intrprete de Java que cree un contexto del hilo del sistema y comience
a ejecutarlo. A continuacin, el mtodo run() de este hilo ser invocado en el nuevo contexto
del hilo. Hay que tener precaucin de no llamar al mtodo start() ms de una vez sobre un hilo
determinado.
run()
El mtodo run() constituye el cuerpo de un hilo en ejecucin. Este es el nico mtodo del
interfazRunnable. Es llamado por el mtodo start() despus de que el hilo apropiado del
sistema se haya inicializado. Siempre que el mtodo run() devuelva el control, el hilo actual se
detendr.
stop()
Este mtodo provoca que el hilo se detenga de manera inmediata. A menudo constituye una
manera brusca de detener un hilo, especialmente si este mtodo se ejecuta sobre el hilo en
curso. En tal caso, la lnea inmediatamente posterior a la llamada al mtodo stop() no llega a
ejecutarse jams, pues el contexto del hilo muere antes de que stop() devuelva el control. Una
forma ms elegante de detener un hilo es utilizar alguna variable que ocasione que el mtodo
run() termine de manera ordenada. En realidad, nunca se debera recurrir al uso de este
mtodo.
suspend()
El mtodo suspend() es distinto de stop(). suspend() toma el hilo y provoca que se detenga su
ejecucin sin destruir el hilo de sistema subyacente, ni el estado del hilo anteriormente en
ejecucin. Si la ejecucin de un hilo se suspende, puede llamarse a resume() sobre el mismo
hilo para lograr que vuelva a ejecutarse de nuevo.

resume()
El mtodo resume() se utiliza para revivir un hilo suspendido. No hay garantas de que el hilo
comience a ejecutarse inmediatamente, ya que puede haber un hilo de mayor prioridad en
ejecucin actualmente, pero resume() ocasiona que el hilo vuelva a ser un candidato a ser
ejecutado.
setPriority( int )
El mtodo setPriority() asigna al hilo la prioridad indicada por el valor pasado como
parmetro. Hay bastantes constantes predefinidas para la prioridad, definidas en la clase
Thread, tales comoMIN_PRIORITY, NORM_PRIORITY y MAX_PRIORITY, que toman los
valores 1, 5 y 10, respectivamente. Como gua aproximada de utilizacin, se puede establecer
que la mayor parte de los procesos a nivel de usuario deberan tomar una prioridad en torno a
NORM_PRIORITY.
getPriority()
Este mtodo devuelve la prioridad del hilo de ejecucin en curso, que es un valor
comprendido entre uno y diez.
setName( String )
Este mtodo permite identificar al hilo con un nombre menmnico. De esta manera se facilita
la depuracin de programas multihilo. El nombre mnemnico aparecer en todas las lneas de
trazado que se muestran cada vez que el intrprete Java imprime excepciones no capturadas.
getName()
Este mtodo devuelve el valor actual, de tipo cadena, asignado como nombre al hilo en
ejecucin mediante setName().
Ciclo de Vida de una Thread Estados de un Hilo
Cada hilo, despus de su creacin y antes de su destruccin, estar en uno de cuatro estados:
recin creada, "corrible", bloqueada, o muerta.

Recin creada (New thread): entra aqu inmediatamente despus de su creacin. Es decir
luego del llamado a new. En este estado los datos locales son ubicados e iniciados. Luego de
la

invocacin

start(),

el

hilo

pasa

al

estado

"corrible".

Corrible (Runnable): Aqu el contexto de ejecucin existe y el hilo puede ocupar la CPU en
cualquier momento. Este estado puede subdividirse en dos: Corriendo y encolado. La
transicin entre estos dos estados es manejado por le itinerador de la mquina virtual.
Nota: Un hilo que invoca al mtodo yield() voluntariamente se mueve a s misma al estado
encolado

desde

el

estado

corriendo.

Bloqueada (not Runnable): Se ingresa cuando: se invoca suspend(), el hilo invoca el mtodo
wait() de algn objeto, el hilo invoca sleep(), el hilo espera por alguna operacin de I/O, o el
hilo invoca join() de otro hilo para espera por su trmino. El hilo vuelve al estado Corrible
cuando

el

evento

por

que

espera

ocurre.

Muerta (Dead): Se llega a este estado cuando el hilo termina su ejecucin (concluye el
mtodo run) o es detenida por otro hilo llamando al su mtodo stop(). Esta ltima accin no es
recomendada.

Multitarea
Con la multitarea el usuario nunca quedar bloqueado -pudiendo seguir usando la aplicacin
mientras algo muy gordo se ejecuta debajo; se eliminan la mayora de pantallas de carga o no
interrumpirn la experiencia de uso de la aplicacin; y se ejecutar de manera ms ptima,
haciendo que el procesador no est esperando continuamente y con cuellos de botella por
llegarle un montn de cosas a la vez. Claro est, si se hace bien.
Comunicacin entre hilos
Otra clave para el xito y la ventaja de la utilizacin de mltiples hilos de ejecucin en una
aplicacin, o aplicacin multithreaded, es que pueden comunicarse entre s. Se pueden disear

hilos para utilizar objetos comunes, que cada hilo puede manipular independientemente de los
otros hilos de ejecucin.

Multi - hilo
Considerando el entorno multithread (multihilo), cada thread (hilo, flujo de control del
programa) representa un proceso individual ejecutndose en un sistema. A veces se les llama
procesos ligeroso contextos de ejecucin. Tpicamente, cada hilo controla un nico aspecto
dentro de un programa, como puede ser supervisar la entrada en un determinado perifrico o
controlar toda la entrada/salida del disco. Todos los hilos comparten los mismos recursos, al
contrario que los procesos, en donde cada uno tiene su propia copia de cdigo y datos
(separados unos de otros). Grficamente, los hilos (threads) se parecen en su funcionamiento a
lo que muestra la figura siguiente:

Multihilo se refiere a que dos o ms tareas se ejecutan "aparentemente" a la vez, dentro de un


mismo programa.
Se usa "aparentemente" en ambos casos, porque normalmente las plataformas tienen una sola
CPU, con lo cual, los procesos se ejecutan en realidad "concurrentemente", sino que
comparten la CPU. En plataformas con varias CPU, s es posible que los procesos se ejecuten
realmente a la vez.

Grupo de Hilos
Todo hilo de ejecucin en Java debe formar parte de un grupo. La clase ThreadGroup define e
implementa la capacidad de un grupo de hilos.
Los grupos de hilos permiten que sea posible recoger varios hilos de ejecucin en un solo
objeto y manipularlo como un grupo, en vez de individualmente. Por ejemplo, se pueden
regenerar los hilos de un grupo mediante una sola sentencia.
Cuando se crea un nuevo hilo, se coloca en un grupo, bien indicndolo explcitamente, o bien
dejando que el sistema lo coloque en el grupo por defecto. Una vez creado el hilo y asignado a
un grupo, ya no se podr cambiar a otro grupo.
Si no se especifica un grupo en el constructor, el sistema coloca el hilo en el mismo grupo en
que se encuentre el hilo de ejecucin que lo haya creado, y si no se especifica en grupo para
ninguno de los hilos, entonces todos sern miembros del grupo "main", que es creado por el
sistema cuando arranca la aplicacin Java.

Multitarea e Hilos
En esencia la multitarea nos permite ejecutar varios procesos a la vez; es decir, de forma
concurrente y por tanto eso nos permite hacer programas que se ejecuten en menor tiempo y
sean ms eficientes. Evidentemente no podemos ejecutar infinitos procesos de forma
concurrente ya que el hardware tiene sus limitaciones, pero raro es a da de hoy los
ordenadores que no tengan ms de un ncleo por tanto en un procesador con dos ncleos se
podran ejecutar dos procesos a la vez y as nuestro programa utilizara al mximo los
recursos hardware. Para que veis la diferencia en un par de imgenes, supongamos que
tenemos un programa secuencial en el que se han de ejecutar 4 procesos; uno detrs de otro, y
estos tardan unos segundos:

Si en vez de hacerlo de forma secuencial, lo hicisemos con 4 hilos, el programa tardara en


ejecutarse solo 20 segundos, es decir el tiempo que tardara en ejecutarse el proceso ms

largo. Esto evidentemente sera lo ideal, pero la realidad es que no todo se puede paralelizar y
hay que saber el nmero de procesos en paralelo que podemos lanzar de forma eficiente. En
principio en esta entrada no vamos a hablar sobre ello ya que el objetivo de la misma es ver
como se utilizan los hilos en java con un ejemplo relativamente sencillo y didctico.

En Java para utilizar la multitarea debemos de


usar la clase Thread (es decir que la clase que
implementemos debe heredar de la clase Thread)
y

la

clase

Thread

implementa

laInterface Runnable. En el siguiente diagrama de


clase mostramos la Interface Runnable y la clase
Thread con sus principales mtodos:

En esta entrada no vamos a ver cmo utilizar


todos los mtodos de la clase Thread, pero os los
mostramos para que sepis que existen y a parte
por su nombre podis intuir su funcionalidad.

Scheduling
Java tiene un Scheduler, una lista de procesos, que monitoriza todos los hilos que se estn
ejecutando en todos los programas y decide cuales deben ejecutarse y cuales deben
encontrarse preparados para su ejecucin. Hay dos caractersticas de los hilos que el scheduler
identifica en este proceso de decisin. Una, la ms importante, es la prioridad del hilo de
ejecucin; la otra, es el indicador de demonio. La regla bsica del scheduler es que si
solamente hay hilos demonio ejecutndose, la Mquina Virtual Java (JVM) concluir. Los
nuevos hilos heredan la prioridad y el indicador de demonio de los hilos de ejecucin que los
han creado. El scheduler determina qu hilos debern ejecutarse comprobando la prioridad de
todos ellos, aquellos con prioridad ms alta dispondrn del procesador antes de los que tienen
prioridad ms baja.
El scheduler puede seguir dos patrones, preemptivo y no-preemptivo. Los schedulers
preemtivos proporcionan un segmento de tiempo a todos los hilos que estn corriendo en el
sistema. El scheduler decide cual ser el siguiente hilo a ejecutarse y llama al mtodo
resume() para darle vida durante un perodo fijo de tiempo. Cuando el hilo ha estado en
ejecucin ese perodo de tiempo, se llama a suspend() y el siguiente hilo de ejecucin en la
lista de procesos ser relanzado (resume()). Los schedulers no-preemtivos deciden que hilo
debe correr y lo ejecutan hasta que concluye.
Prioridades
El scheduler determina el hilo que debe ejecutarse en funcin de la prioridad asignada a cada
uno de ellos. El rango de prioridades oscila entre 1 y 10. La prioridad por defecto de un hilo
de ejecucin es NORM_PRIORITY, que tiene asignado un valor de 5. Hay otras dos variables
estticas disponibles, que son MIN_PRORITY, fijada a 1, y MAX_PRIORITY, que tiene un
valor de 10. El mtodo getPriority()puede utilizarse para conocer el valor actual de la
prioridad de un hilo.

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().

BIBLIOGRAFA

Libro:
JAVA Cmo Programar
Novena Edicin
Paul Deitel Harvey Deiltel
Pgina Web:
https://sites.google.com/a/espe.edu.ec/programacion-ii/

Вам также может понравиться