En primer lugar, debo señalar que la detención de un hilo es NO fácil. De hecho, en el caso general, las discusiones no se puede detener con seguridad:
Usted puede llamar a Thread.interrupt()
en un hilo del que desea detener, pero no hay ninguna garantía de que el hilo se dará cuenta de la interrupción, y mucho menos en realidad detener.
Puede llamar al método obsoleto Thread.stop()
, pero este método no es seguro. Si lo llama en un momento desafortunado, puede dejar las estructuras de datos en un estado medio actualizado, dejar que otros hilos esperen (para siempre) señales que no llegarán y así sucesivamente.
Así es como me gustaría implementar un organismo de control para la ejecución del método.
Primero modificaría el método para agregar dos llamadas al servicio de vigilancia; p.ej.
public void someMethod(...) {
Watchdog.startMethod(maxTime);
// do stuff
Watchdog.endMethod();
}
A continuación, me gustaría poner en práctica el perro guardián con una cola de prioridad ordenada en el tiempo de caducidad:
- El
startMethod(maxTime)
sería añadir una entrada a la cola con el tiempo de caducidad de now + maxTime
. La entrada podría incluir una referencia a la hebra actual (cuando se llama al método.
- El
endMethod()
sería buscar una (la entrada de cola) para el subproceso actual, y retirarla si se encuentra.
- El hilo watchdog haría periódicamente mira la primera entrada de la cola. Si esa entrada tiene un vencimiento inferior a 'ahora', el perro guardián eliminaría la entrada, detendría su hilo y verificaría la siguiente entrada. Repite hasta que la siguiente entrada no haya expirado.
Se debería pensar en las estructuras de datos y en los casos en que se omiten las llamadas endMethod
. (De hecho, desde una llamada de método puede terminar debido a una excepción, la llamada endMethod()
realmente necesita ser hecho en un bloque finally
.)
Tenga en cuenta que los startMethod
y endMethod
llamadas podían (y tal vez deberían) ser insertados mediante una anotación procesador o algo por el estilo
Dada la complejidad y el hecho de que no se puede garantizar para detener el hilo (con seguridad), pensaría que de alguna solución que no implique un perro guardián método.
¿Tal vez los aspectos valen? –
"Un hilo es fácil de detener", no, no lo es. No entiendo "¿cómo puedo asegurar los métodos normales de los objetos?", Ni el ejemplo que sigue con el ciclo sin fin. – toto2
http://download.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html Lea todo eso y luego compruebe que aún desea llamar a stop(). Tal vez sea necesario pensar fuera del cuadro proverbial para evitar su problema. – RichColours