(similar a "Resettable Java Timer" pero hay algunas sutilezas que necesito para explorar)tiempo de espera de puesta a cero en Java
necesito una característica de tiempo de espera reajustable, de modo que si mi clase no realiza una acción particular dentro de un intervalo de tiempo T0 (donde T0 es en el barrio de 50-1000msec), a continuación, un método es llamado:
class MyClass {
static final private timeoutTime = 50;
final private SomeTimer timer = new SomeTimer(timeoutTime,
new Runnable() { public void run() {
onTimeout();
}});
private void onTimeout() { /* do something on timeout */ }
public void criticalMethod() { this.timer.reset(); }
}
¿Qué puedo usar para implementar esto? Estoy familiarizado con ScheduledExecutorService, y la idea de llamar a ScheduledFuture.cancel() y reprogramar la tarea parece como debería funcionar, pero luego hay un peligro potencial si cancela() falla y la tarea programada se ejecuta cuando no debería. Siento que me falta una sutileza aquí.
También (quizás más importante), ¿hay alguna manera de probar mi implementación/probar que funciona correctamente?
edición: Estoy particularmente preocupado por el caso en el que se llama a menudo criticalMethod()
(quizás varias veces por milisegundo) ... si uso ScheduledExecutorService, apenas se parece como un problema de recursos potencial para seguir creando nuevas tareas programadas + cancelando los viejos, en lugar de tener una manera directa de reprogramar una tarea.
Como una adición final a mi respuesta, definitivamente deberías leer Java Concurrency in Practice si no lo has hecho aún. Todas las ideas en mi respuesta provienen de ese libro (o experiencia personal, pero el libro coincide con mis experiencias). –