2009-09-02 8 views
5

Necesito usar stop obsoleto() porque necesito ejecutar clases Runnable que fueron desarrolladas por otros programadores y no puedo usar while (isRunning == true) dentro del método run.¿Puedo usar thread.stop() en Java si realmente lo necesito?

La pregunta es: ¿es suficientemente seguro usar el método stop()? Los ladrones no funcionan con ningún recurso (como archivos, bases de datos o conexiones a Internet). Pero quiero estar seguro de que la JVM no se corromperá después de detener una docena de hilos con el método stop().

P.S .: Sí, puedo escribir algo de código para probarlo, pero espero que alguien sabe la respuesta)

Respuesta

6

o menos. No hay nada inherentemente "corrupto" sobre Thread.stop(). El problema es que puede dejar objetos en un estado dañado, cuando el hilo que los ejecuta se detiene de repente. Si el resto de su programa no tiene visibilidad para esos objetos, entonces está bien. Por otro lado, si algunos de esos objetos son visibles para el resto del programa, es posible que se encuentre con problemas que son difíciles de diagnosticar.

+0

Si los objetos se dañarían 'lógicamente' pero no físicamente, entonces no me importa en este caso)) – Roman

0

La JVM no estará corrupta, pero lea los javadocs de cerca para asegurarse de que no cumple con sus condiciones de "desastre".

Tendrá que echar un vistazo a los monitores de sincronización a los que se sujeta el hilo. Ha mencionado los archivos y los sockets como recursos que se cuelgan, pero también deberá tener en cuenta las estructuras de datos compartidas. También asegúrese de que su manejo de excepciones no atrape RuntimeException s (vea stop()).

4

Si usa Thread.stop, probablemente se saldrá con la suya, asumiendo que tiene pocos usuarios. Es excepcionalmente difícil de probar. Puede causar una excepción en cualquier lugar en la ejecución del código. No puedes probar todas las situaciones posibles. En su máquina en su configuración, es posible que nunca encuentre un problema; En la próxima actualización de JRE su programa podría comenzar a fallar con un error intermitente muy oscuro.

Un caso de problema de ejemplo es si el subproceso está cargando una clase en ese momento. La clase no se carga y no se volverá a intentar. Tu programa está roto.

1

Me dirigí a esto en mi pregunta "Are thread stop and friends ever safe?", y en una de las respuestas, traté de descubrir las condiciones previas que harían seguro el uso de stop(). Pero esto sigue siendo un "trabajo en progreso".

BTW: escribir código de prueba no necesariamente ayudará. (Las pruebas solo prueban la presencia de errores, no la ausencia de errores.) Sería mejor intentar razonar sobre el problema, OMI. Pero no es sencillo :-).

Cuestiones relacionadas