You are on page 1of 7

Manejo de Threads (Metodos)

Los mtodos start() y run()


Como habamos mencionado antes, para poner en marcha este nuevo Thread se debe llamar
al mtodo start(), heredado de la sper-clase Thread, que se encarga de llamar a run(). Es
importante no confundir el mtodo start() con el mtodo run(). El mtodo run() contiene el
cdigo a ser ejecutado asincrnicamente en otro thread, mientras que el mtodo start() es
el que crea al Thread y en algn punto hace que ese Thread ejecute lo que esta en run().
Este mtodo devuelve el control inmediatamente. Pero si mezclamos todo y ejecutamos
directamente el run(), el cdigo se ejecutara en el Thread actual.
El mtodo start() devuelve el control inmediatamente mientras tanto, el nuevo Thread
inicia su recorrido por el mtodo run(). Hasta cuando? Hasta que termina ese mtodo,
cuando sale, termina el Thread.
El mtodo join()
Si un Thread necesita esperar a que otro termine (por ejemplo el Thread padre espera a que
termine el hijo) puede usar el mtodo join(). Por que se llama as? Crear un proceso es
como una bifurcacin, se abren 2 caminos, que uno espere a otro es lo contrario, una
unificacin.
A continuacin se presenta un ejemplo ms complejo: una reunin de alumnos. El siguiente
ejemplo usa Threads para activar simultneamente tres objetos de la misma clase, que
comparten los recursos del procesador pelendose para escribir a la pantalla.
public static void main(String args[]) throws InterruptedException{
Thread juan = new Thread (new Alumno(Juan));
Thread luis = new Thread (new Alumno(Luis));
Thread nora = new Thread (new Alumno(Nora));
juan.start();
juan.join();
pepe.start();
pepe.join();
jorge.start();
jorge.join();
}
El metodo join() que llamamos al final hace que el programa principal espere hasta que
este Thread este muerto(finalize su ejecucion). Este mtodo puede disparar la excepcin
InterruptedException, por lo que lo hemos tenido en cuenta en el encabezamiento del
mtodo.

En nuestro ejemplo, simplemente a cada instancia de Alumno() que creamos la hemos


ligado a un Thread y puesto a andar. Corren todas en paralelo hasta que mueren de muerte
natural, y tambin el programa principal termina.
A continuacin se muestra la clase Alumno:
class Alumno implements Runnable{
String mensaje;
public Alumno(String nombre){
mensaje = Hola, soy + nombre + y este es mi mensaje numero: ;
}
public void run(){
for (int i=1; i<6;i++){
String msj = mensaje + i;
System.out.println(msj);
}
}
La salida ser ms o menos as:
Hola, soy Juan y este es mi mensaje numero 1
Hola, soy Juan y este es mi mensaje numero 2
Hola, soy Juan y este es mi mensaje numero 3
Hola, soy Juan y este es mi mensaje numero 4
Hola, soy Juan y este es mi mensaje numero 5
.etc.
El mtodo yield()
El mtodo yield() tiene la funcin de hacer que un hilo que se est ejecutando de regreso al
estado en listo para ejecutar para permitir que otros hilos de la misma prioridad puedan
ejecutarse. Sin embargo, el funcionamiento de este mtodo (al igual que de los hilos en
general) no est garantizado, puede que despus de que se establezca un hilo por medio del
mtodo yield() a su estado listo para ejecutar, ste vuelva a ser elegido para ejecutarse. El
mtodo yield() nunca causar que un hilo pase a estado de espera/bloqueado/dormido,
simplemente pasa de ejecutndose(running) a listo para ejecutar.
A continuacin tomando el ejemplo anterior solo haremos una modificacin en el mtodo
run, vemos como se implementa dicho metodo:
public void run(){
for (int i=1; i<6; i++){

String msj = mensaje + i;


System.out.println(msj);
Thread.yield();
}
}
En este ejemplo la salida ser ms o menos as:
Hola, soy Juan y este es mi mensaje 1
Hola, soy Luis y este es mi mensaje 1
Hola, soy Nora y este es mi mensaje 1
Hola, soy Juan y este es mi mensaje 2
Hola, soy Luis y este es mi mensaje 2
Hola, soy Nora y este es mi mensaje 2
Hola, soy Juan y este es mi mensaje 3
Hola, soy Luis y este es mi mensaje 3
etc.
El mtodo sleep()
El mtodo sleep() simplemente le dice al Thread que duerma durante los milisegundos
especficos. Se debera utilizar sleep() cuando se pretenda retrasar la ejecucin del Thread,
sleep() no consume recursos del sistema mientras el Thread duerme. De esta forma otros
Threads seguir funcionando.
objThread.sleep(1000) //Duerme al hilo objThread 1 seg
El mtodo currentThread()
Para saber qu hilo se encuentra en ejecucin en un momento determinado, existe el
mtodo esttico Thread.currentThread().
Thread.currentThread().getName() te devuelve un valor de tipo cadena con el nombre del
hilo en ejecucin, si no has definido un nombre con el mtodo setName(), de igual manera
el proceso lo tendr, algo muy parecido a Thread-0, Thread-1, etc.
El mtodo suspend() Deprecado(No se debe utilizar)
Puede resultar til suspender la ejecucin de un Thread sin marcar un lmite de tiempo. Si,
por ejemplo, esta construyendo 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().
objThread.suspend();
-Ver explicacin de porque esta deprecado o porque no se debe utilizar El mtodo resume() Deprecado(No se debe utilizar)

El mtodo suspend() no detiene la ejecucin permanente. El Thread queda suspendido


indefinidamente y para volver a activarlo de nuevo necesitamos realizar una invocacin al
mtodo resume();
objThread.resume();
-Ver explicacin de porque esta deprecado o porque no se debe utilizar El mtodo stop() Deprecado (No se debe utilizar)
El mtodo stop() da una muerte abrupta a un hilo.
objThread.stop();

Manejo de Threads (Metodos)


Los mtodos start() y run()
Como habamos mencionado antes, para poner en marcha este nuevo Thread se debe llamar
al mtodo start(), heredado de la sper-clase Thread, que se encarga de llamar a run(). Es
importante no confundir el mtodo start() con el mtodo run(). El mtodo run() contiene el
cdigo a ser ejecutado asincrnicamente en otro thread, mientras que el mtodo start() es
el que crea al Thread y en algn punto hace que ese Thread ejecute lo que esta en run().
Este mtodo devuelve el control inmediatamente. Pero si mezclamos todo y ejecutamos
directamente el run(), el cdigo se ejecutara en el Thread actual.
El mtodo start() devuelve el control inmediatamente mientras tanto, el nuevo Thread
inicia su recorrido por el mtodo run(). Hasta cuando? Hasta que termina ese mtodo,
cuando sale, termina el Thread.
El mtodo join()
Si un Thread necesita esperar a que otro termine (por ejemplo el Thread padre espera a que
termine el hijo) puede usar el mtodo join(). Por que se llama as? Crear un proceso es
como una bifurcacin, se abren 2 caminos, que uno espere a otro es lo contrario, una
unificacin.
A continuacin se presenta un ejemplo ms complejo: una reunin de alumnos. El siguiente
ejemplo usa Threads para activar simultneamente tres objetos de la misma clase, que
comparten los recursos del procesador pelendose para escribir a la pantalla.
public static void main(String args[]) throws InterruptedException{
Thread juan = new Thread (new Alumno(Juan));
Thread luis = new Thread (new Alumno(Luis));
Thread nora = new Thread (new Alumno(Nora));
juan.start();
juan.join();

pepe.start();
pepe.join();
jorge.start();
jorge.join();
}
El metodo join() que llamamos al final hace que el programa principal espere hasta que
este Thread este muerto(finalize su ejecucion). Este mtodo puede disparar la excepcin
InterruptedException, por lo que lo hemos tenido en cuenta en el encabezamiento del
mtodo.
En nuestro ejemplo, simplemente a cada instancia de Alumno() que creamos la hemos
ligado a un Thread y puesto a andar. Corren todas en paralelo hasta que mueren de muerte
natural, y tambin el programa principal termina.
A continuacin se muestra la clase Alumno:
class Alumno implements Runnable{
String mensaje;
public Alumno(String nombre){
mensaje = Hola, soy + nombre + y este es mi mensaje numero: ;
}
public void run(){
for (int i=1; i<6;i++){
String msj = mensaje + i;
System.out.println(msj);
}
}
La salida ser ms o menos as:
Hola, soy Juan y este es mi mensaje numero 1
Hola, soy Juan y este es mi mensaje numero 2
Hola, soy Juan y este es mi mensaje numero 3
Hola, soy Juan y este es mi mensaje numero 4
Hola, soy Juan y este es mi mensaje numero 5
.etc.
El mtodo yield()

El mtodo yield() tiene la funcin de hacer que un hilo que se est ejecutando de regreso al
estado en listo para ejecutar para permitir que otros hilos de la misma prioridad puedan
ejecutarse. Sin embargo, el funcionamiento de este mtodo (al igual que de los hilos en
general) no est garantizado, puede que despus de que se establezca un hilo por medio del
mtodo yield() a su estado listo para ejecutar, ste vuelva a ser elegido para ejecutarse. El
mtodo yield() nunca causar que un hilo pase a estado de espera/bloqueado/dormido,
simplemente pasa de ejecutndose(running) a listo para ejecutar.
A continuacin tomando el ejemplo anterior solo haremos una modificacin en el mtodo
run, vemos como se implementa dicho metodo:
public void run(){
for (int i=1; i<6; i++){
String msj = mensaje + i;
System.out.println(msj);
Thread.yield();
}
}
En este ejemplo la salida ser ms o menos as:
Hola, soy Juan y este es mi mensaje 1
Hola, soy Luis y este es mi mensaje 1
Hola, soy Nora y este es mi mensaje 1
Hola, soy Juan y este es mi mensaje 2
Hola, soy Luis y este es mi mensaje 2
Hola, soy Nora y este es mi mensaje 2
Hola, soy Juan y este es mi mensaje 3
Hola, soy Luis y este es mi mensaje 3
etc.
El mtodo sleep()
El mtodo sleep() simplemente le dice al Thread que duerma durante los milisegundos
especficos. Se debera utilizar sleep() cuando se pretenda retrasar la ejecucin del Thread,
sleep() no consume recursos del sistema mientras el Thread duerme. De esta forma otros
Threads seguir funcionando.
objThread.sleep(1000) //Duerme al hilo objThread 1 seg
El mtodo currentThread()
Para saber qu hilo se encuentra en ejecucin en un momento determinado, existe el
mtodo esttico Thread.currentThread().
Thread.currentThread().getName() te devuelve un valor de tipo cadena con el nombre del
hilo en ejecucin, si no has definido un nombre con el mtodo setName(), de igual manera
el proceso lo tendr, algo muy parecido a Thread-0, Thread-1, etc.

El mtodo suspend() Deprecado(No se debe utilizar)


Puede resultar til suspender la ejecucin de un Thread sin marcar un lmite de tiempo. Si,
por ejemplo, esta construyendo 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().
objThread.suspend();
-Ver explicacin de porque esta deprecado o porque no se debe utilizar El mtodo resume() Deprecado(No se debe utilizar)
El mtodo suspend() no detiene la ejecucin permanente. El Thread queda suspendido
indefinidamente y para volver a activarlo de nuevo necesitamos realizar una invocacin al
mtodo resume();
objThread.resume();
-Ver explicacin de porque esta deprecado o porque no se debe utilizar El mtodo stop() Deprecado (No se debe utilizar)
El mtodo stop() da una muerte abrupta a un hilo.
objThread.stop();

You might also like