¿Cómo detener la ejecución después de un cierto tiempo en Java?

5 minutos de lectura

¿Como detener la ejecucion despues de un cierto tiempo en
codificador s2000

En el código, el temporizador variable especificaría la duración después de la cual finalizará el bucle while, 60 segundos, por ejemplo.

   while(timer) {
    //run
    //terminate after 60 sec
   }

  • Parece que estamos repitiendo un hilo viejo aquí: stackoverflow.com/questions/2550536/…

    – Dmitri

    23 nov.

  • Posible duplicado de Cómo agotar el tiempo de espera de un hilo

    – vhunsicker

    25 de noviembre de 2016 a las 14:17

long start = System.currentTimeMillis();
long end = start + 60*1000; // 60 seconds * 1000 ms/sec
while (System.currentTimeMillis() < end)
{
    // run
}

  • pero si una iteración del ciclo comienza cuando comienza a los 59 segundos y cada iteración del ciclo toma más de 1 segundo, superaría los 60 segundos, ¿verdad? ¿Es esto lo mejor que se puede hacer? Lo pregunto por pura ignorancia.

    – rami

    23 nov.

  • @Ramy: no. El start y end son tiempos absolutos, medidos en milisegundos desde la época (medianoche, 1 de enero de 1970 UTC). No hay vuelco.

    – bola mate

    23 nov.

  • ok, pero la verificación solo ocurre al comienzo del ciclo. Entonces, si al comienzo del ciclo, digamos que han transcurrido 59 segundos, y cada iteración del ciclo toma, digamos, 5 segundos. La próxima vez que se verifique la condición del bucle while, habrán transcurrido 64 segundos. Bien, ¿o me estoy perdiendo algo?

    – rami

    23 nov.

  • Creo que Ramy tiene razón. Suponga que el trabajo en el bucle tarda 7 segundos en completarse. Después de una ejecución estás en 7 segundos, luego en 14… hasta que hayas completado 8 iteraciones, para un total de 56 segundos. La verificación tendrá éxito (porque tiene menos de 60 años), pero luego los cálculos tomarán 7 segundos. En el momento en que se vuelve a realizar la comprobación, estás en 63 segundos. Eso es 5% con el tiempo.

    – MBCook

    23 nov.

  • @MattBall ¿Por qué es dudoso interrumpir un cálculo? Realmente depende de tus necesidades. Probablemente obtuvo algunos votos negativos, porque no explicó lo que realmente pretende hacer su código -> evitar que se ejecute el código “ejecutar” de nuevo después de 60 segundos. Lo cual es bastante diferente de “terminar después de 60 segundos”, que probablemente se esperaba que hicieran las personas, al leer la pregunta.

    – Murmel

    06 sep.

¿Como detener la ejecucion despues de un cierto tiempo en
d0x

debe probar los nuevos Java Executor Services.
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html

Con esto, no necesita programar el bucle para medir el tiempo usted mismo.

public class Starter {

    public static void main(final String[] args) {
        final ExecutorService service = Executors.newSingleThreadExecutor();

        try {
            final Future<Object> f = service.submit(() -> {
                // Do you long running calculation here
                Thread.sleep(1337); // Simulate some delay
                return "42";
            });

            System.out.println(f.get(1, TimeUnit.SECONDS));
        } catch (final TimeoutException e) {
            System.err.println("Calculation took to long");
        } catch (final Exception e) {
            throw new RuntimeException(e);
        } finally {
            service.shutdown();
        }
    }
}

  • ¿Cuál es el valor del tiempo de espera que se estableció aquí?

    – Nikk

    08 jul.

  • ¿A qué te refieres con “el tiempo muerto”? El Thread.sleep(1337);?

    – Murmel

    06 sep.

  • Creo que por “tiempo de espera”, @nikk significa la cantidad de tiempo después del cual se cerrará el servicio.

    – alma perdida29

    08 jun.

  • @nikk El tiempo de espera es “1” segundo. Mira: f.get()

    – Sebastián D’Agostino

    10 ago. 17 en 15:09


  • No detiene el programa. Mi programa tarda 20 segundos en completarse. Muestra que el cálculo tardó mucho después de 1 segundo, pero no detiene el programa. Sigo viendo la salida después de 20 segundos.

    –Rohit Singh

    01 sep.

Si no puede superar su límite de tiempo (es un límite estricto), entonces un hilo es su mejor opción. Puede usar un bucle para terminar el hilo una vez que llegue al umbral de tiempo. Lo que sea que esté sucediendo en ese hilo en ese momento puede interrumpirse, lo que permite que los cálculos se detengan casi instantáneamente. Aquí hay un ejemplo:

Thread t = new Thread(myRunnable); // myRunnable does your calculations

long startTime = System.currentTimeMillis();
long endTime = startTime + 60000L;

t.start(); // Kick off calculations

while (System.currentTimeMillis() < endTime) {
    // Still within time theshold, wait a little longer
    try {
         Thread.sleep(500L);  // Sleep 1/2 second
    } catch (InterruptedException e) {
         // Someone woke us up during sleep, that's OK
    }
}

t.interrupt();  // Tell the thread to stop
t.join();       // Wait for the thread to cleanup and finish

Eso le dará una resolución de aproximadamente 1/2 segundo. Al sondear más a menudo en el ciclo while, puede reducirlo.

La ejecución de su ejecutable se vería así:

public void run() {
    while (true) {
        try {
            // Long running work
            calculateMassOfUniverse();
        } catch (InterruptedException e) {
            // We were signaled, clean things up
            cleanupStuff();
            break;           // Leave the loop, thread will exit
    }
}

Actualización basada en la respuesta de Dmitri

Dmitri señaló TimerTask, lo que le permitiría evitar el bucle. Simplemente podría hacer la llamada de unión y la TimerTask que configuró se encargaría de interrumpir el hilo. Esto le permitiría obtener una resolución más exacta sin tener que sondear en un bucle.

  • así no es como .interrupt() funciona, sin embargo. A menos que el subproceso esté bloqueado, solo establece el interrupted indicador, el subproceso todavía tiene que verificarlo para detener la ejecución. También, InterruptedException es una excepción comprobada, no puede simplemente arrojarla alrededor de un código arbitrario (su ejemplo no se compilará).

    – Dmitri

    23 nov.

Depende de lo que esté haciendo el ciclo while. Si existe la posibilidad de que se bloquee durante mucho tiempo, utilice TimerTask para programar una tarea para establecer un stopExecution bandera, y también .interrupt() tu hilo

Con solo una condición de tiempo en el ciclo, podría permanecer allí para siempre esperando una entrada o un bloqueo (por otra parte, puede que no sea un problema para usted).

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad