Thread.stop () – obsoleto

¿Por qué Thread.stop() en desuso en Java? En su sitio web, veo lo siguiente:

¿Por qué Thread.stop está en desuso?

Porque es inherentemente inseguro. Detener un hilo hace que desbloquee todos los monitores que ha bloqueado. (Los monitores se desbloquean porque la excepción ThreadDeath propaga por la stack). Si alguno de los objetos previamente protegidos por estos monitores estaba en un estado incoherente, es posible que otros hilos vean estos objetos en un estado incoherente. Dichos objetos se dice que están dañados. Cuando los hilos operan en objetos dañados, puede resultar en un comportamiento arbitrario. Este comportamiento puede ser sutil y difícil de detectar, o puede ser pronunciado. A diferencia de otras excepciones no verificadas, ThreadDeath mata los hilos silenciosamente; por lo tanto, el usuario no tiene ninguna advertencia de que su progtwig puede estar dañado. La corrupción puede manifestarse en cualquier momento después de que ocurra el daño real, incluso horas o días en el futuro.

No entiendo lo que quieren decir con “monitores”. De todos modos, mi pregunta es si Thread.stop() no debería Thread.stop() entonces, ¿cómo debería detenerse un hilo Java?

Tu preguntaste:

Mi pregunta es si no hay manera de detener un hilo en Java, ¿cómo detener un hilo?

La respuesta: en Java no existe una manera limpia, rápida o confiable de detener un hilo.

La terminación del hilo no es tan directa. Un hilo conductor, a menudo llamado por muchos escritores como un proceso liviano, tiene su propia stack y es el dueño de su propio destino (los demonios están bien). Puede poseer archivos y sockets. Puede contener lockings. La terminación abrupta no siempre es fácil: pueden surgir consecuencias impredecibles si el hilo está en el medio de escribir en un archivo y se elimina antes de que pueda terminar de escribir. ¿O qué pasa con los lockings del monitor que sostiene el hilo cuando se dispara en la cabeza?

En cambio, los hilos confían en un mecanismo cooperativo llamado Interrupción . Esto significa que Threads solo podría señalar a otros hilos para detenerlos, no forzarlos a detenerse.

Para detener los hilos en Java, dependemos de un mecanismo cooperativo llamado Interrupción. El concepto es muy simple. Para detener un hilo, todo lo que podemos hacer es entregarle una señal, también conocida como interrupción, solicitando que el hilo se detenga en la próxima oportunidad disponible. Eso es todo. No se sabe lo que el hilo del receptor podría hacer con la señal: puede que ni siquiera se moleste en verificar la señal; o peor aún ignorarlo.

Fuente: http://10kloc.wordpress.com/2013/03/03/java-multithreading-steeplechase-stopping-threads/

La forma correcta es usar una unión. En lugar de detener prematuramente la ejecución de un hilo, join esperará a que el hilo termine la ejecución antes de pasar a la siguiente instrucción.

 Thread exampleThread = new Thread(){ public void run(){ try { Thread.sleep(2000); } catch (InterruptedException ex) { //handle the exception } } }; exampleThread.start(); exampleThread.join(); 

Aquí exampleThread.join () esperará hasta que exampleThread termine de ejecutarse antes de pasar a la siguiente instrucción. Sin embargo, la responsabilidad de asegurarse de que el hilo termina la ejecución está en el progtwigdor. En esencia, no hay forma de detener un hilo, pero si lo diseñas bien no deberías detener el hilo.

Cuando su hilo maneja las interrupciones correctamente, debe ser posible terminarlo instantáneamente con el uso de la interfaz ExecutorService . Según la documentación de Oracle, el método ExecutorService.shutdownNow() intenta detener todas las tareas que se ejecutan activamente sin esperar su finalización. Sin embargo, no hay garantías más allá de los bashs de mejor esfuerzo para detenerlos. Aquí hay un código de muestra:

 class MyThread implements Runnable{ @Override public void run() { for (int i = 1; i < 10000000; i++) try { System.out.println(i + " ThreadID: " + Thread.currentThread().getId()); if (Thread.interrupted()) throw new InterruptedException(); } catch (InterruptedException e) { return; } } } ExecutorService executor = Executors.newFixedThreadPool(3); executor.submit(new MyThread()); executor.submit(new MyThread()); executor.submit(new MyThread()); executor.shutdownNow(); 

Sin terminación, cada hilo debe imprimir el mensaje a la consola 10000000 veces. executor.shutdownNow() método executor.shutdownNow() detiene instantáneamente los tres hilos.

Desde https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html :

La mayoría de los usos de stop deberían reemplazarse por un código que simplemente modifique alguna variable para indicar que el hilo de destino debe dejar de ejecutarse. El hilo de destino debe verificar esta variable regularmente, y regresar de su método de ejecución de manera ordenada si la variable indica que debe dejar de ejecutarse. Para garantizar la comunicación rápida de la solicitud de detención, la variable debe ser volátil (o el acceso a la variable debe estar sincronizado).