2011-10-26 15 views
5

Quiero forzar el método para que se ejecute durante el tiempo especificado.Método de fuerza ejecutado durante el intervalo de tiempo especificado

public Response run(Request req){ 
    //method runImpl must run during specified interval of time(for example for 10 secs) 
    Response res = runImpl(req); 
    return response; 
    } 

¿Cuál es la mejor manera de hacer esto? Gracias!

+1

La implementación de una velocidad de hasta Loop? http://thedailywtf.com/Articles/The-Speedup-Loop.aspx –

+1

¿Qué quiere decir con "ejecutar durante el intervalo especificado"? ¿Debería completarse dentro de ese intervalo? ¿Solo regresas después de ese intervalo? ¿Ser llamado continuamente durante ese intervalo? –

+3

Su uso de la palabra "durante" aquí es muy confuso. –

Respuesta

2

runImpl debería devolver un valor booleano para que este código funcione. Probablemente querrás esto en un nuevo hilo (abundan los tutoriales básicos) si no quieres que tu programa se estanque hasta que termine.

public Response run(Request req){ 
long lasttime=Sys.getTime(); 
int i=0; 
while(i<10){ 
    if(Response res = runImpl(req);){ 
    return response; 
    } 
    if((Sys.getTime-lasttime)>1000){ 
    i++; 
    lasttime=Sys.getTime(); 
    } 
} 
return null; 

Esto va en cada momento procesador, si desea que se ejecute en un intervalo además de correr durante 10 segundos, utilice:

public Response run(Request req){ 
long lasttime=Sys.getTime(); 
int i=0; 
for(int i; i<(10000/yourchoiceinterval); i++){ 
    if(Response res = runImpl(req);){ 
    return response; 
    } 
    if((Sys.getTime-lasttime)>1000){ 
    lasttime=Sys.getTime(); 
    } 
} 
return null; 
1

El mejor método sería hacer su trabajo en trozos de tamaño adecuado, por lo que cada trozo se puede hacer en, digamos, 1 segundo. De esta forma, al final de cada fragmento puede verificar si ha transcurrido el tiempo.

Si su trabajo implica trabajo de E/S que puede bloquearse por tiempo indefinido, intente utilizar métodos interrumpibles (que pueden interrumpirse mediante la llamada al Thread.interrupt()) o métodos que aceptan tiempo de ejecución máximo explícito del llamador.
O puede delegar el trabajo de E/S en algún subproceso dedicado y comprobar su progreso en un subproceso separado, y actuar de forma apropiada cuando se excede el tiempo de ejecución.

+0

¿Qué hacer si durante la ejecución de un fragmento la función se "cuelga"? – Martin

+0

@Martin Supuse que no hay pasos que puedan "colgarse", con cualquier probabilidad razonable. Si hay tales pasos, por ejemplo, E/S de red, use un hilo para E/S y otro para verificar el progreso de E/S y cancelar la E/S tan pronto como sea necesario. –

3

intenta utilizar esto:

poolExecutor = new ScheduledThreadPoolExecutor(1); 
poolExecutor.scheduleAtFixedRate(
     new YourRunable(), startFrom/*10*/, startEvery/*5*/, TimeUnit.SECONDS); 
+0

Sí, esto es todo. ¡A eso me refería! – SHiRKiT

+0

esto no exige que el ejecutable se ejecute durante un máximo de X segundos: tiene la intención de iniciar el ejecutable comenzando en N segundos y volviendo a invocar cada M segundos –

0

Se podría empezar un nuevo hilo que sólo llama a su método y ponerlo a dormir después de un temporizador expira a crear. De esta forma, aunque no se puede garantizar que el ciclo del método se haya completado antes de la suspensión, se soluciona el problema sin tener que modificar el método. Para que usted logre ciclos, simplemente ponga esta lógica de dormir dentro del ciclo del hilo. Simplemente recuerde despertar el hilo

Puede haber docenas de implementaciones ya que no explicó lo suficientemente claro.

Cuestiones relacionadas