viernes, 19 de octubre de 2012

Controlando los Threads (Ciclo de vida)


Que es el ciclo de vida
El ciclo de vida de un Thread representa los estados por los cuales puede pasar un Thread desde que nace hsta que muere. Durante el ciclo de vida de un Thread, este se puede encontrar en diferentes estados. La figura siguiente muestra estos estados y los métodos que provocan el paso de un estado a otro.

Diagrama de ciclo de vida

















- Para ver un diagrama mas detallado del ciclo de vida de un Thread ver la entrada "Estados de un Thread" Ciclo de Vida Extendido -

Método Deprecados (Desaconsejados) - Threads -

El método stop(), que ocasiona el lanzamiento de la excepción ThreadDeath en el thread destino. La excepción se genera sea cual sea el método que está ejecutando el thread. La idea es que la excepción no se capture, de modo que vaya subiendo en la pila de llamadas de el thread destino, hasta llegar al método run(), que tampoco la capturaría, finalizando la ejecución de el Thread. La excepción ThreadDeath es la única que es ignorada por el método uncaughtException(...) de la clase ThreadGroup, de modo que el usuario no recibe ningún mensaje en la salida de error por culpa de dicha excepción.
        ThreadDeath hereda intencionadamente de Error, en lugar de Exception, pues lo que se quiere es que no sea capturada, y como existe el uso generalizado de la construcción:

    try {
       ...
    }
    catch (Exception e) {
       ...
    }


         prefirieron que ThreadDeath no heredara de Exception, a pesar de que no entra dentro de la filosofía de la clase Error.

Manejo de Threads (Metodos)

Los métodos start() y run()
Como habíamos mencionado antes, para poner en marcha este nuevo Thread se debe llamar al método start(), heredado de  la súper-clase Thread, que se encarga de llamar a run(). Es importante no confundir el método start() con el método run(). El método run() contiene el código a ser ejecutado “asincrónicamente” en otro thread, mientras que el método start() es el que crea al Thread y en algún punto hace que ese Thread ejecute lo que esta en run(). Este método devuelve el control inmediatamente. Pero si mezclamos todo y ejecutamos directamente el run(), el código se ejecutara en el Thread actual.

El método start() devuelve el control inmediatamente… mientras tanto, el nuevo Thread inicia su recorrido por el método run(). ¿Hasta cuando? Hasta que termina ese método, cuando sale, termina el Thread.

El método join()
Si un Thread necesita esperar a que otro termine (por ejemplo el Thread padre espera a que termine el hijo) puede usar el método join(). ¿Por que se llama así? Crear un proceso es como una bifurcación, se abren 2 caminos, que uno espere a otro es lo contrario, una unificación.

Creación de Threads

Alternativas de creación
En Java hay dos formas de crear nuevos threads. La primera de ellas consiste en crear una nueva clase que herede de la clase  java.lang.Thread y sobrecargar el método run() de dicha clase. El segundo método consiste en declarar una clase que implemente la interfaz java.lang.Runnable, la cual declarara el método run(); posteriormente se enviara dicho objeto a la clase Thread.

En este caso, se ha creado la clase MiClase, que hereda de Thread y después haremos lo mismo pero implementando Runnable. La principal actividad del thread, es que escriba 10 veces el nombre del thread creado.

Para poner en marcha este nuevo thread se debe llamar la método start(), heredado de la súper-clase Thread, que se encarga de llamar a run().

Introducción a Threads


Que es un Thread (Hilo de Ejecución).
Un concepto fundamental en programación es la idea de manejar más de una tarea a la vez. Muchos problemas de programación requieren que el programa pueda detener lo que este haciendo, tratar con algún otro problema y regresar al proceso principal.

Dentro de un programa, las partes que corren separadamente se llaman hilos (Thread) y el concepto general se llama Multithreading.

Ordinariamente, los hilos son una manera de asignar el tiempo de un solo procesador. Pero si el sistema operativo apoya procesadores múltiples, cada hilo puede asignarse a