You are on page 1of 58

Threads

Instructor: Juan Manuel Stein Carrillo

martes 26 de octubre de 2010

Representa un proceso individual ejecutndose en un sistema. A veces se les llama procesos ligeros o contextos de ejecucin. Tpicamente, cada thread 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 threads 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).

martes 26 de octubre de 2010

Es la clase que encapsula todo el control necesario sobre los hilos de ejecucin (threads).

martes 26 de octubre de 2010

currentThread() yield() sleep( long ) ______________________________


currentThread()
Este mtodo devuelve el objeto thread que representa al hilo de ejecucin que se est ejecutando actualmente.

martes 26 de octubre de 2010

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 los 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.

martes 26 de octubre de 2010

start() run() stop() suspend() resume() setPriority( int ) getPriority() setName( String ) getName()

martes 26 de octubre de 2010

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.

martes 26 de octubre de 2010

El mtodo run() constituye el cuerpo de un hilo en ejecucin. Este es el nico mtodo del interfaz Runnable. 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.

martes 26 de octubre de 2010

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 inmediata 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.

martes 26 de octubre de 2010

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.

martes 26 de octubre de 2010

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.

martes 26 de octubre de 2010

El mtodo setPriority() asigna al hilo la prioridad indicada por el valor pasado como parmetro. Hay bastantes constantes predenidas para la prioridad, denidas en la clase Thread, tales como:
MIN_PRIORITY (toma el valor de 1) NORM_PRIORITY (toma el valor de 5) MAX_PRIORITY(toma el valor de 10)

martes 26 de octubre de 2010

Este mtodo devuelve la prioridad del hilo de ejecucin en curso, que es un valor comprendido entre uno y diez.

Este mtodo devuelve el valor actual, de tipo cadena, asignado como nombre al hilo en ejecucin mediante setName().

martes 26 de octubre de 2010

Hay dos modos de conseguir hilos de ejecucin (threads) en Java.


Una es implementando el interfaz Runnable, la otra es extender la clase Thread.

El primer mtodo de crear un hilo de ejecucin es simplemente extender la clase Thread:


class MiThread extends Thread { public void run() { ... }

martes 26 de octubre de 2010

El ejemplo anterior crea una nueva clase MiThread que extiende la clase Thread y sobreescribe el mtodo Thread.run() por su propia implementacin. El mtodo run() es donde se realizar todo el trabajo de la clase. Extendiendo la clase Thread, se pueden heredar los mtodos y variables de la clase padre. En este caso, solamente se puede extender o derivar una vez de la clase padre. Esta limitacin de Java puede ser superada a travs de la implementacin de Runnable:
public class MiThread implements Runnable { Thread t; public void run() { // Ejecucin del thread una vez creado } }

martes 26 de octubre de 2010

No pensar que el interfaz Runnable est haciendo alguna cosa cuando la tarea se est ejecutando. Solamente contiene mtodos abstractos, es una clase para dar idea sobre el diseo de la clase Thread. De hecho, si se observan los fuentes de Java, se puede comprobar que solamente contiene un mtodo abstracto:
package java.lang; public interface Runnable { public abstract void run();

martes 26 de octubre de 2010

Qu son los hilos? Los hilos son una CPU virtual. Las tres partes de al hilo son los siguientes: CPU Cdigo Datos

martes 26 de octubre de 2010

martes 26 de octubre de 2010

La Programacin multi-hilo tiene estas caractersticas:


Mltiples hilos desde una instancia Runnable. Los Hilos comparten los mismos datos y el cdigo.

Por ejemplo:

martes 26 de octubre de 2010

martes 26 de octubre de 2010

martes 26 de octubre de 2010

martes 26 de octubre de 2010

martes 26 de octubre de 2010

martes 26 de octubre de 2010

martes 26 de octubre de 2010

martes 26 de octubre de 2010

Prueba de hilos:
IsAlive ()

Prioridad de Acceso en un Thread:


getPriority () setPriority ()

Coloque los hilos en suspenso:

martes 26 de octubre de 2010

Las aplicaciones ejecutan main() tras arrancar. Esta es la razn de que main() sea el lugar natural para crear y arrancar otros hilos. La lnea de cdigo: t1 = new TestTh( "Thread 1",(int) (Math.random()*2000) ); crea un nuevo hilo de ejecucin. Los dos argumentos pasados representan el nombre del hilo y el tiempo que se desea que espere antes de imprimir el mensaje. Al tener control directo sobre los hilos, hay que arrancarlos explcitamente. Ejemplo: t1.start(); start(), en realidad es un mtodo oculto en el hilo de ejecucin que llama a run().

martes 26 de octubre de 2010

Si todo fue bien en la creacin del hilo, t1 debera contener un thread vlido, que controlaremos en el mtodo run(). Una vez dentro de run(), se pueden comenzar las sentencias de ejecucin como en otros programas. run() sirve como rutina main() para los hilos; cuando run() termina, tambin lo hace el hilo. Todo lo que se quiera que haga el hilo de ejecucin ha de estar dentro de run(), por eso cuando se dice que un mtodo es Runnable, es obligatorio escribir un mtodo run(). En este ejemplo, se intenta inmediatamente esperar durante una cantidad de tiempo aleatoria (pasada a travs del constructor): sleep( retardo );

martes 26 de octubre de 2010

Puede resultar til suspender la ejecucin de un hilo sin marcar un lmite de tiempo. Si, por ejemplo, est construyendo un applet con un hilo de animacin, seguramente se 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 los hilos de ejecucin se puede utilizar el mtodo suspend(). t1.suspend(); Este mtodo no detiene la ejecucin permanentemente. El hilo es suspendido indenidamente y para volver a activarlo de nuevo se necesita realizar una invocacin al mtodo resume(): t1.resume();

martes 26 de octubre de 2010

El ltimo elemento de control que se necesita sobre los hilos de ejecucin es el mtodo stop(). Se utiliza para terminar la ejecucin de un hilo: t1.stop(); Esta llamada no destruye el hilo, 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 hilo, el objeto Thread (creado con new) quedar marcado para eliminarlo y el garbage collector se encargar de liberar la memoria que utilizaba.

martes 26 de octubre de 2010

Se puede comprobar si un hilo est vivo o no; considerando vivo un hilo que ha comenzado y no ha sido detenido. t1.isAlive(); Este mtodo devolver true en caso de que el hilo 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.

martes 26 de octubre de 2010

Todo hilo de ejecucin en Java debe formar parte de un grupo. La clase ThreadGroup dene 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, 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.

martes 26 de octubre de 2010

Si no se especica 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 especica 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. En la ejecucin de los ejemplos de esta seccin, se ha podido observar la circunstancia anterior. Por ejemplo, el resultado en pantalla de uno de esos ejemplos es el que se reproduce a continuacin:

martes 26 de octubre de 2010

Como resultado de la ejecucin de sentencias del tipo: System.out.println( Thread.currentThread() ); Para presentar la informacin sobre el hilo de ejecucin. Se puede observar que aparece el nombre del hilo, su prioridad y el nombre del grupo en que se encuentra englobado.

La clase Thread proporciona constructores en los que se puede especicar el grupo del hilo que se esta creando en el mismo momento de instanciarlo, y tambin mtodos como setThreadGroup(), que permiten determinar el grupo en que se encuentra un hilo de ejecucin.

martes 26 de octubre de 2010

martes 26 de octubre de 2010

La siguiente sentencia crea un nuevo hilo de ejecucin pero no lo arranca, lo deja en el estado de Nuevo Thread:
Thread MiThread = new MiClaseThread(); Thread MiThread = new Thread( new UnaClaseThread,"hiloA" );

Cuando un hilo est en este estado, es simplemente un objeto Thread vaco. El sistema no ha destinado ningn recurso para l. Desde este estado solamente puede arrancarse llamando al mtodo start(), o detenerse denitivamente, llamando al mtodo stop(); la llamada a cualquier otro mtodo carece de sentido y lo nico que provocar ser la generacin de una excepcin de tipo IllegalThreadStateException.

martes 26 de octubre de 2010

Ahora obsrvense las dos lneas de cdigo que se presentan a continuacin: Thread MiThread = new MiClaseThread(); MiThread.start(); La llamada al mtodo start() crear los recursos del sistema necesarios para que el hilo puede ejecutarse, lo incorpora a la lista de procesos disponibles para ejecucin del sistema y llama al mtodo run() del hilo de ejecucin. En este momento se encuentra en el estado Ejecutable del diagrama. Y este estado es Ejecutable y no En Ejecucin, porque cuando el hilo est aqu no esta corriendo. Muchos computadoras tienen solamente un procesador lo que hace imposible que todos los hilos estn corriendo al mismo tiempo. Java implementa un tipo de scheduling o lista de procesos, que permite que el procesador sea compartido entre todos los procesos

martes 26 de octubre de 2010

El hilo de ejecucin entra en estado Parado cuando alguien llama al mtodo suspend(), cuando se llama al mtodo sleep(), cuando el hilo est bloqueado en un proceso de entrada/salida o cuando el hilo utiliza su mtodo wait() para esperar a que se cumpla una determinada condicin. Cuando ocurra cualquiera de las cuatro cosas anteriores, el hilo estar Parado.

martes 26 de octubre de 2010

Thread MiThread = new MiClaseThread(); MiThread.start(); try { MiThread.sleep( 10000 ); } catch( InterruptedException e ) { } la lnea de cdigo que llama al mtodo sleep(): MiThread.sleep( 10000 );

martes 26 de octubre de 2010

Un hilo de ejecucin se puede morir de dos formas: por causas naturales o porque lo maten (con stop()). Un hilo muere normalmente cuando concluye de forma habitual su mtodo run(). Por ejemplo, en el siguiente cdigo, el bucle while es un bucle nito -realiza la iteracin 20 veces y termina: public void run() { int i=0; while( i < 20 ) { i++; System.out.println( "i = "+i ); } } Un hilo que contenga a este mtodo run(), morir naturalmente despus de que se complete el bucle y run() concluya.

martes 26 de octubre de 2010

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.

martes 26 de octubre de 2010

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

martes 26 de octubre de 2010

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.

martes 26 de octubre de 2010

El ejemplo clsico de comunicacin de hilos de ejecucin es un modelo productor/consumidor. Un hilo produce una salida, que otro hilo usa (consume), sea lo que sea esa salida. Entonces se crea un productor, que ser un hilo que ir sacando caracteres por su salida; y se crea tambin un consumidor que ir recogiendo los caracteres que vaya sacando el productor y un monitor que controlar el proceso de sincronizacin entre los hilos de ejecucin. Funcionar como una tubera, insertando el productor caracteres en un extremo y leyndolos el consumidor en el otro, con el monitor siendo la propia tubera.

martes 26 de octubre de 2010

martes 26 de octubre de 2010

martes 26 de octubre de 2010

martes 26 de octubre de 2010

martes 26 de octubre de 2010

martes 26 de octubre de 2010

martes 26 de octubre de 2010

martes 26 de octubre de 2010

martes 26 de octubre de 2010

martes 26 de octubre de 2010

martes 26 de octubre de 2010

martes 26 de octubre de 2010

Continua

martes 26 de octubre de 2010

martes 26 de octubre de 2010

You might also like