Ejecute un Java durante un período de tiempo determinado

for(int i = 1; i < 10000; i++) {
Command nextCommand = getNextCommandToExecute();
}

Quiero ejecutar el programa anterior durante 60 minutos. Entonces, en lugar de for loop, necesito hacer algo como-

long startTime = System.nanoTime();

    do{
    Command nextCommand = getNextCommandToExecute();
    } while (durationOfTime is 60 minutes);

Pero no estoy seguro, ¿cómo debo hacer que este programa funcione durante 60 minutos?

preguntado el 22 de mayo de 12 a las 19:05

¿Me puede mostrar un ejemplo usando ThreadPoolExecutor? -

simplemente calcule la diferencia desde el inicio y la hora actual antes de cada prueba de condición. -

@usoban ¿Qué pasa si se trata de una tarea continua? No recuperará el control hasta que termine la tarea, si es que lo hace alguna vez. -

eso es cierto, sin embargo, no dijo eso en la pregunta. -

¿Alguien puede explicarme cuál puede ser el problema con la lógica de bucle do while? Como dice skynorth, ¿puede haber algún problema? -

5 Respuestas

Inicie un subproceso en segundo plano que duerma durante 60 minutos y salga:

Runnable r = new Runnable() {
    @Override
    public void run() {
        try {
            Thread.sleep(60 * 60 * 1000L);
        }
        catch (InterruptedException e) {
            // ignore: we'll exit anyway
        }
        System.exit(0);
    }
}
new Thread(r).start();
<your original code here>

contestado el 22 de mayo de 12 a las 19:05

Entonces, en esto, donde ejecutaré mi comando como si mirara mi ejemplo, necesito realizar algunas tareas y después de 60 minutos, quiero detener el programa. - AKIWEB

Ver mi edición. Comienzas el hilo antes de ejecutar tu código original. - JB Nizet

Tenga en cuenta que al usar este método, su comando final puede ser eliminado en medio de su ejecución. Si analiza algún resultado, probablemente querrá omitir el último comando, ya que estará incompleto. - Thomas

@ Nevzz03, esta es una forma muy cruda de detener su programa, pero funciona. - jn1kk

@skynorth Te quejas de que las personas muestran un código que no detiene la tarea en curso y ahora te quejas del código que sí lo hace. Sabes que no hay una manera correcta de hacer esto. Thread.interrupt es solo un consejo, así que de nuevo puedes seguir quejándote. - Marko Topolnik

long startTime = System.currentTimeMillis();
do 
{
  //stuff
} while (System.currentTimeMillis() - startTime < 1000*60*60);

contestado el 22 de mayo de 12 a las 19:05

Como le dije a la otra persona: "¿Qué pasa si se trata de una tarea continua? No recuperarás el control hasta después de que termines la tarea, si es que lo haces" - jn1kk

intente lo siguiente:

long startTime = System.currentTimeMillis();
long endTime = startTime + (60*60*1000);

while(System.currentTimeMillis() <= endTime) {
    Command nextCommand = getNextCommandToExecute();
}

Un inconveniente de este método es que si el Command está tratando de ejecutar carreras más allá del temporizador de 60 minutos o nunca termina. Si este comportamiento no está permitido, es mejor implementar un subproceso que interrumpa cualquier subproceso que esté ejecutando este bucle.

contestado el 22 de mayo de 12 a las 19:05

Como le dije a la otra persona: "¿Qué pasa si se trata de una tarea continua? No recuperarás el control hasta después de que termines la tarea, si es que lo haces" - jn1kk

@skynorth ¡Gracias! Abordado en una edición. Puede o no ser un problema para la operación, dependiendo de otros requisitos del programa. - colin d

long startTime = System.currentTimeMillis();

do{
Command nextCommand = getNextCommandToExecute();
}while (startTime < startTime+60*60*1000);

contestado el 22 de mayo de 12 a las 19:05

Se podría utilizar:

long startTime = System.nanoTime();
do {
    Command nextCommand = getNextCommandToExecute();
} while ((System.nanoTime() - startTime) < 60 * 60 * 1000000000L);

Por favor note System.nanoTime() es ligeramente diferente de usar System.currentTimeMillis() no solo en la escala, sino también en lo que mide: System.nanoTime() es el tiempo transcurrido y System.currentTimeMillis() es la hora del sistema (reloj de pared). Si cambia la hora del sistema, System.currentTimeMillis() no funciona como se esperaba. (Sin embargo, esto no se aplica al cambio de horario de verano, ya que el valor devuelto es UTC / GMT).

1000000000L nanosegundos es un segundo. Tenga en cuenta la L para long. En Java 7 también podría escribir el más legible 1_000_000_000L.

contestado el 22 de mayo de 12 a las 19:05

Como le dije a la otra persona: "¿Qué pasa si se trata de una tarea continua? No recuperarás el control hasta después de que termines la tarea, si es que lo haces" - jn1kk

tal vez getNextCommandToExecute() esté bloqueando, por lo que si no hay comandos, el programa no se apagará. También un bucle infinito vacío es una mala idea. Tratar de usar Thread.sleep(60*60000L) en hilo de fondo - alaster

El código anterior es la respuesta a la pregunta original. La pregunta (al menos originalmente) no era sobre la creación de un nuevo hilo o la ejecución de cosas en segundo plano, o sobre qué pasa si getNextCommandToExecute() bloquea o no. - Thomas Mueller

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.