2011-03-09 46 views
8

Tengo un método que devuelve un String, ¿es posible que después de cierto tiempo se exija el umbral para que dicho método devuelva una cadena específica?Establecer el límite de tiempo de ejecución en un método en java

+0

Waht desea es llamar a su método y si su tiempo de ejecución supera una cierta cantidad de la cadena devolviendo es una constante? – reef

+0

@reef nop, cuando el método x que devuelve algo de cadena alcanza, por ejemplo, 6 segundos de tiempo de ejecución para devolver alguna cadena de error ... o simplemente tiene algún tipo de devolución de llamada que puedo usar para manejar el error de tiempo. – London

Respuesta

14

El Guava library tiene un muy buen TimeLimiter que le permite hacer esto en cualquier método definido por una interfaz. Puede generar un proxy para su objeto que tiene un tiempo de espera "incorporado".

+0

esto parece, solo déjame preguntarte esto, este ejemplo no está claro para mí porque soy un novato, 'para devolver el valor de target.someMethod()', ¿este 'target' se refiere a la instancia de clase? – London

+0

otra pregunta, ¿qué pasa si este método abre algunas sesiones, se cerrarán? ¿O debo cerrar estas sesiones antes de devolver el valor predeterminado? – London

+0

@London. 1) sí eso es lo que significa. 2) el método necesita cerrar esas sesiones usando 'try {...} finally {...}'. ¡Pero debería estar haciendo eso de todos modos! –

9

Hice algo similar en el pasado cuando se generaba un proceso externo con Runtime.getRuntime().exec(command). Creo que se podría hacer algo como esto dentro de su método:

Timer timer = new Timer(true); 
InterruptTimerTask interruptTimerTask = 
    new InterruptTimerTask(Thread.currentThread()); 
timer.schedule(interruptTimerTask, waitTimeout); 
try { 
    // put here the portion of code that may take more than "waitTimeout" 
} catch (InterruptedException e) { 
    log.error("timeout exeeded); 
} finally { 
    timer.cancel(); 
} 

y aquí está InterruptTimerTask

/* 
* A TimerTask that interrupts the specified thread when run. 
*/ 
protected class InterruptTimerTask extends TimerTask { 

    private Thread theTread; 

    public InterruptTimerTask(Thread theTread) { 
     this.theTread = theTread; 
    } 

    @Override 
    public void run() { 
     theTread.interrupt(); 
    } 

} 
+0

"Scedule" no se utiliza como un límite de tiempo, sino como un retraso ... por lo que "waitTimeout" en este caso es el retraso antes de que se ejecute interrupTTimerTask ... desde la API: planifica la tarea especificada para la ejecución después de la especificada retrasar. – Kayvar

+2

Aparece un error en el try/catch: 'bloque catch inalcanzable para InterruptedException. Esta excepción nunca se lanza desde el cuerpo de la declaración try. – Michael

1

Como respondió de @MarcoS

encontré tiempo de espera no se produce si el método es algo bloqueo y no liberar el tiempo de CPU al temporizador. Entonces el temporizador no puede iniciar un nuevo hilo. Así que cambio un poco al iniciar el hilo inmediatamente y dormir dentro del hilo.

 InterruptTimerTaskAddDel interruptTimerTask = new InterruptTimerTaskAddDel(
       Thread.currentThread(),timeout_msec); 

     timer.schedule(interruptTimerTask, 0); 

     /* 
* A TimerTask that interrupts the specified thread when run. 
*/ 
class InterruptTimerTaskAddDel extends TimerTask { 

    private Thread theTread; 
    private long timeout; 

    public InterruptTimerTaskAddDel(Thread theTread,long i_timeout) { 
     this.theTread = theTread; 
     timeout=i_timeout; 
    } 

    @Override 
    public void run() { 
     try { 
      Thread.currentThread().sleep(timeout); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(System.err); 
     } 
     theTread.interrupt(); 
    } 

} 
1

Puede utilizar AOP y una anotación @Timeable de jcabi-aspects (soy un desarrollador):

@Timeable(limit = 1, unit = TimeUnit.SECONDS) 
String load(String resource) { 
    while (true) { 
    if (Thread.currentThread.isInterrupted()) { 
     throw new IllegalStateException("time out"); 
    } 
    // execution as usual 
    } 
} 

Cuando se alcanza el límite de tiempo el hilo recibirá interrupted() bandera establece en true y es su trabajo manejar esta situación correctamente y detener la ejecución.

Además, verifique esta entrada del blog: http://www.yegor256.com/2014/06/20/limit-method-execution-time.html

Cuestiones relacionadas