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
Respuesta
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".
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
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
@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! –
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();
}
}
"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
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
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();
}
}
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
- 1. tiempo de ejecución "real" límite
- 2. Establecer un límite de tiempo de espera para readLine()?
- 3. modificar un método/función en el tiempo de ejecución
- 4. Evite el límite de tiempo de ejecución de PHP
- 5. Llamar a un método denominado "cadena" en el tiempo de ejecución en Java y C
- 6. método de llamada en tiempo de ejecución
- 7. Método de tiempo de espera en java
- 8. Cómo inyectar IL en un método en tiempo de ejecución
- 9. Java: resolución de método de tiempo de ejecución
- 10. Tiempo de ejecución de CPU en Java
- 11. ¿Cómo puedo establecer un límite de tiempo en get_file_contents en PHP?
- 12. Cómo establecer java.net.preferIPv4Stack = true en tiempo de ejecución?
- 13. ¿es posible anular un método en tiempo de ejecución?
- 14. Establecer el límite de tiempo en una tarea específica con apio
- 15. Reemplazar el método Property Setter en tiempo de ejecución
- 16. Java: Extendiendo clase en tiempo de ejecución
- 17. ¿Cuenta el tiempo de espera para el límite de tiempo de ejecución?
- 18. Cambiar un método en tiempo de ejecución a través de un mecanismo de intercambio en caliente
- 19. Cargando jar en el tiempo de ejecución
- 20. Escaneo de anotaciones Java en el tiempo de ejecución
- 21. Obtiene el tiempo de ejecución de un subproceso Java
- 22. Agregar archivos a Java classpath en el tiempo de ejecución
- 23. ¿Cómo puedo comparar el tiempo de ejecución del método en Java?
- 24. C# Método de anulación en tiempo de ejecución
- 25. ¿Cómo se puede establecer un límite de tiempo para ejecutar un script de PowerShell?
- 26. encontrar nuevas clases de Java en tiempo de ejecución
- 27. ¿Cómo establecer el límite de tiempo de grabación de video en iPhone?
- 28. Interrumpir el hilo después de un límite de tiempo especificado en Java
- 29. Mida el tiempo de ejecución en C#
- 30. Establecer el directorio de ejecución en Eclipse?
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
@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