En la programación multiproceso de Java, el tipo java.lang.Thread contiene una serie de métodos start(), stop(), stop(Throwable) y suspend(), destroy() y resume(). A través de estos métodos, podemos realizar operaciones convenientes en subprocesos, pero entre estos métodos, solo se conserva el método start().
Las razones para abandonar estos métodos se explican en detalle en un artículo de Sun "¿Por qué están obsoletos Thread.stop, Thread.suspend y Thread.resume?"
Si realmente necesita terminar un hilo, puede utilizar los siguientes métodos:
1. Deje que el método run() del hilo termine de ejecutarse y el hilo finalice naturalmente. (Este método es el mejor)
2. Finalice el hilo sondeando y compartiendo bits de bandera, como while (bandera) {}, el valor inicial de la bandera se establece en verdadero y, cuando sea necesario terminar, establezca el valor de la bandera en falso. (Este método tampoco es muy bueno, porque si el método while(flag){} se bloquea, la bandera dejará de ser válida)
parada booleana volátil privada = false;
terminación del vacío público () {
detener = verdadero;
}
ejecución pública vacía() {
mientras(detener) {
// ... algunas declaraciones
}
}
}
Si el hilo entra en el estado No ejecutable debido a la ejecución de dormir () o esperar (), si es esperar (), no funcionará si se usa el bit de bandera.
espera de anulación final pública (tiempo de espera prolongado)
lanza InterruptedException Este método hace que el hilo actual (llámelo T) se coloque en el conjunto de espera del objeto y luego abandone todos los requisitos de sincronización en este objeto. Es decir, el hilo actual pasa a un estado de espera.
Uso estándar de esperar()
sincronizado(obj){
while(<condición no cumplida>){
obj.espera();
}
Proceso de procesamiento que satisface las condiciones.
}
Y quieres detenerlo, puedes usar el tercero, es decir.
3. Utilice interrupción () y el programa generará una excepción InterruptedException, lo que provocará que el hilo de ejecución abandone el método run ().
Por ejemplo:
clase pública Algún hilo {
principal vacío estático público (String [] args)
{
Hilo hilo = nuevo hilo (nuevo Runnable(){
ejecución pública vacía() {
mientras (!Thread.interrupted()) {
// Procesar el trabajo a procesar
intentar {
System.out.println("ir a dormir");
Hilo.dormir(1000);
} captura (Excepción interrumpida e) {
e.printStackTrace();
System.out.println("¡Estoy interrumpido!");
}
});
hilo.start();
hilo.interrupt();
}
}
ve a dormir
¡Estoy interrumpido!