4.3 Creacion y Control de Hilos
4.3 CREACIÓN Y CONTROL DE
HILOS
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 resimida,está definida asi:
public class Thread extends Object implements Runnable
{
//Atributos
static int MAX_PRIORITY;
//Prioridad máxima que un hilo puede tener.
static int MIN_PRIORITY;
//Prioridad mínima que un hilo puede tener.
static int NORM_PRIORITY;
//Prioridad asignada por omisión a un hilo.
//Constructores
Thread ([argumentos])
//Métodos
static Theread currentThread()
/Devuelve una referencia al hilo que actualmente esta en ejecución.
long getID()
//Devuelve el identificador del hilo.
String getName()
//Devuelve el nombre del hilo.
int getPriority()
//Devuelve la prioridad del hilo.
void interrupt()
//Envía 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
//operación específica 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 código que es ejecutará cuando el hilo pase
//al estado de ejecución.Por omisión 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 omisión es normal
//(NORM_PRIORITY).
static void sleep(long milisegundos[,int nanosegundos])
//Envía este hilo a dormir por el tiempo especificado.
void start()
//Inicia la ejecución de este hilo:la máquina virtual de Java
//invoca al método run de este hilo.
static void yield()
//Detiene temporalmente la ejecución de este hilo para
//permitir la ejecución de otros.
//Métodos heredados de la clase Object:notify,notifyAll y wait void notify()
//Despierta un hilo de los que están esperando por el
//monitor de este objeto.
void notifyAll()
//Despierta todos los hilos que están esperando por el
//monitor de este objeto.
void wait ([milisegundos[,nanosegundos]])
//Envía este hilo al estado de espera hasta que otro hilo
//invoque al método notify o notifyAll,o hasta que transcurra
//el tiempo especificado.
}
Una clase que implemente la interfaz Runnable tiene que sobreescribir el método run aportado por está,de ahí que Thread proporcione este método aunque no haga nada.El método run contendrá el código que debe ejecutar el hilo.
Los métodos stop,suspend,resume,destroy y countStackFrames incluidos en versiones anteriores han sido desaprobados porque son intrínsecamente inseguros.
Control de un hilo
Arranque de un hilo
En el contexto de las aplicaciones, sabemos que es main la primera función que se invoca tras arrancar, y por tanto, lógicamente, es el lugar más apropiado para crear y arrancar otros hilos.
La línea de código:
t1 = new Test Th?( “Thread 1″,(int)(Math.random()*2000) );
Siendo Test Th una subclase de la clase Thread (o una clase que implemente la interfaz Runnable) crea un nuevo hilo. Los dos argumentos pasados, sin mayor relevancia, satisfarán el prototipo del constructor de la clase y se utilizarán para la inicialización del objeto.
Al tener control directo sobre los hilos, tenemos que arrancarlos explícitamente. Como ya se comentó anteriormente, es la función miembro start la que nos permite hacerlo. En nuestro ejemplo sería:
t1.start();
start, en realidad es un método oculto en el hilo que llama al método run.
Manipulación de un hilo
Si todo fue bien en la creación del objeto Test Th (t1), éste debería contener un hilo, una traza de ejecución válida, que controlaremos en el método run del objeto.
El cuerpo de esta función miembro viene a ser el cuerpo de un programa como ya los conocemos. Digamos que es la rutina main a nivel de hilo. Todo lo que queremos que haga el hilo debe estar dentro del método run. Cuando finalice run, finalizará también el hilo que lo ejecutaba.
Suspensión de un Hilo
La función miembro suspend de la clase Thread permite tener un control sobre el hilo de modo que podamos desactivarlo, detener su actividad durante un intervalo de tiempo indeterminado, a diferencia del uso de la llamada al sistema sleep, que simplemente lleva al hilo a un estado de “dormido”, y siempre durante un número de milisegundos concreto.
Este método puede resultar útil si, construyendo un applet con un hilo de animación,queremos permitir al usuario detener (que no finalizar) la animación, hasta que éste decida reanudarla.
Este método no detiene la ejecución permanentemente. El hilo es suspendido indefinidamente y para volver a activarlo de nuevo necesitamos realizar una invocación a la función miembro resume.
Parada de un Hilo
Ya conocemos los métodos de control de hilos que nos permiten arrancarlos, suspenderlos y reanudarlos. El último elemento de control que se necesita sobre hilos es el método stop, utilizado para terminar la ejecución de un hilo de forma permanente:
t1.stop();
Señalar que esta llamada no destruye el hilo, sino que detiene su ejecución, y ésta no puede reanudarse con el método start. Cuando se desasignen las variables que se usan en el hilo, el objeto hilo (creado con new) quedará marcado para eliminarlo y el garbage collector (recolector de basura de Java) se encargará de liberar la memoria que utilizaba.
Tiene sentido su utilidad, por ejemplo, en aplicaciones complejas que necesiten un control sobre cada uno de los hilos que se lancen.
Por último, un método de control de hilos que nos permite comprobar si una instancia está viva (el hilo se ha arrancado y aún no se ha detenido) o no (bien no se arrancó; bien ya finalizó).
Estamos hablando de la función miembro isAlive.
t1.isAlive();
Devolverá true en caso de que el hilo t1 esté vivo, es decir, ya se haya llamado a su método run y no haya sido parado con un stop ni haya terminado el método run en su ejecución. En otro caso, lógicamente, devolverá false.
Creación de Hilos
Video
Comentarios
Publicar un comentario