Finalizar un hilo

Un hilo termina de forma natural cuando su método run devuelve el control. Cuando esto sucede, el hilo pasa a estar muerto (o sea, ha terminado), y no hay forma de salir de este estado. O sea, una vez que el hilo está muerto, no puede ser arrancado otra vez. Si deseamos ejecutar otra vez la tarea desempeñada por el hilo, hay que construir un nuevo objeto hilo, y enviarle el mensaje start.

Por ejemplo, supongamos una clase, Contador1, que muestra un contador ascendente que será detenido cuando el atributo continuar sea false. La clase, además de este atributo y el método run que muestra la cuenta, tiene un método terminar que pone el atributo continuar a false, y dos constructores: el primero inicia el hilo con el nombre asignado por omisión, y el segundo, también lo inicia, pero con el nombre pasado como argumento.

Veamos esto:

public class Contador1 extends Thread {

private boolean continuar = true;

public Contador1() {
start();
}

public Contador1(String nombre) {
if (nombre != null) {
setName(nombre);
}
// El hilo ejecuta su propio método run
start();
}

@Override
public void run() {
int i = 1;

while (continuar) {

System.out.println(getName() + ” ” + i + “\r”);

}
System.out.println();
}

public void terminar() {
continuar = false;
}

}

Y la siguiente aplicación inicia un demonio de la clase EjemploDemonio (explicada y expuesta aquí), y un hilo de la clase Contador1. Mientras este hilo muestra un contador ascendente en la pantalla, el demonio escribe prueba cada segundo. El contador se detendrá cuando el usuario pulse la tecla entrar.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class TesteoContador {

public static void main(String[] args) {

// Lanzamos el demonio:
EjemploDemonio dejemplo = new EjemploDemonio();

// Lanzamos el hilo cuenta
Contador1 cuenta = new Contador1(“El contador: “);

System.out.println(“Pulse [Entrar] para finalizar”);
InputStreamReader is = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(is);

try {
br.readLine();
} catch (IOException ex) {
// Permitir al hilo cuenta finalizar
cuenta.terminar();
}
}

}

 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s