2011-08-09 13 views
6

tengo que escribir un "WatchDog" en Java, que asegura que los subprocesos no se ejecutan demasiado tiempo. Con la inicialización de los Objetos no hay problema, hice una Clase, que llama al WatchDog y al constructor con reflejos en el método run().Cómo asegurar métodos en java (desbordamiento, etc.)

Un subproceso es fácil de detener, pero ¿cómo puedo asegurar los métodos normales de los objetos? Por ejemplo, llamo al método de un Objeto y este método realiza un ciclo sin fin, ¿cómo lo haría?

gracias

+0

¿Tal vez los aspectos valen? –

+0

"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

+0

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

Respuesta

3

métodos normales de los objetos se están ejecutando en algunos hilo. Puede ser el despachador de eventos AWT o como se llame. O podría ser el hilo principal, por ejemplo, de una aplicación de consola.

No son diferentes a los hilos que se llaman con el nuevo Thread().

Supongo que su perro guardián debe mirar todos los hilos en la VM y buscar los que tienen una utilización> = algún umbral.

¿Qué código tiene hasta ahora?

Rich

+0

okey, tal vez lo describí mal, le doy a mi perro guardián todos los hilos que quiero observar. Solo quiero inicializar el Objeto y ejecutar cada método en un hilo, y darle ese hilo a mi perro guardián. – Nicolas

+0

Hola Nicolas ¿Puedes mejorar esto? Específicamente, "solo quiero inicializar el objeto y ejecutar cada método en un hilo, y darle ese hilo a mi perro guardián". parte. Probablemente pueda ayudar, pero no entiendo lo que estás haciendo. – RichColours

+0

Aquí está mi código para una instancia segura y una llamada a un método seguro: http://pastebin.com/v8kdvdUW Espero que pueda entender lo que quiero hacer. – Nicolas

4

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:

  1. 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.
  2. El endMethod() sería buscar una (la entrada de cola) para el subproceso actual, y retirarla si se encuentra.
  3. 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.

+0

Esta es la forma correcta de resolver el problema. No tengo idea de por qué no se escogió como respuesta. Si alguien quiere una solución lista, intente @ Timeable como se presentó @ yegor256. Pero no resuelve el problema de "Limpieza después de la interrupción". Personalmente, aún escribiría mi propio aspecto. –

1

intenta utilizar @Timeable anotación de jcabi-aspects:

public class Resource { 
    @Timeable(limit = 5, unit = TimeUnit.SECONDS) 
    public String load(URL url) { 
    return url.openConnection().getContent(); 
    } 
} 

Su método se interrumpirá el tiempo de espera.

Cuestiones relacionadas