2010-04-24 35 views
20

Quiero escribir un bucle en Java que abetos se inicia y va así:Java Loop cada minuto

while (!x){ 
    //wait one minute or two 

    //execute code 
} 

Quiero hacer esto para que no utiliza los recursos del sistema. Lo que realmente está sucediendo en el código es que va a un sitio web y verifica si se hace algo, si no se hace, debe esperar otro minuto hasta que vuelva a verificarse, y cuando termina, se mueve. ¿Es de todos modos hacer esto en Java?

Respuesta

45

Use Thread.sleep(long millis).

Hace que el hilo se está ejecutando actualmente para dormir (cesar temporalmente la ejecución) para el número especificado de milisegundos, sin perjuicio de la precisión y exactitud de los temporizadores y programadores del sistema. El hilo no pierde la propiedad de ningún monitor.

Un minuto sería (60*1000) = 60000 milisegundos.


Por ejemplo, este bucle se imprimirá el momento actual una vez cada 5 segundos:

Si su periodo de sueño se vuelve demasiado grande para int, calcular explícitamente en long (por ejemplo 1000L).

+0

Gracias, voy a probarlo. –

+0

Lo probé y no funcionó mi código es el siguiente-- if (link.equalsIgnoreCase ("exit") && count> 0) { boolean fetched = false; int myCounter = 0; try { while (! Fetched) { System.out.println ("Comprobación (" + myCounter + ")"); if (session.areLinkDoneFetching()) { sesión.getFetchData(); session.clearList(); fetched = true; } myCounter ++; Thread.sleep (5 * 1000); } } catch (InterruptedException e) { e.printStackTrace(); } } –

+0

¿Qué quiere decir que "no funcionó"? No compila? No duerme durante 5 segundos a la vez? – polygenelubricants

10
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); 
executor.schedule(yourRunnable, 1L, TimeUnit.MINUTES); 
... 
// when done... 
executor.shutdown(); 
+1

No olvides [shutdown()] (http://java.sun.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html#shutdown%28%29) después de su uso, de lo contrario, el hilo se bloqueará. Ah, el OP no solicitó la programación a tarifa fija. Simplemente use [schedule()] (http://java.sun.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html#schedule%28java.lang.Runnable,%20long,%20java. util.concurrent.TimeUnit% 29). – BalusC

+0

tenga en cuenta que no se cerrará el hilo si está en un bucle. shutdownNow interrumpirá también el hilo (que necesita manejar) – user2130951

+0

puede usar 'Executors.newSingleThreadScheduledExecutor()' en lugar de 'Executors.newScheduledThreadPool (1);' si necesita un solo hilo – Nicofisi

40

Puede utilizar Timer

Timer timer = new Timer(); 

timer.schedule(new TimerTask() { 
    public void run() { 
     // do your work 
    } 
}, 0, 60*1000); 

Cuando llegue el momento

timer.cancel(); 

Para apagarlo.

+0

Si toma 'TimerTask', diga , 55 segundos para ejecutarse, ¿esperará esto solo 5 segundos antes de cada ejecución, o esperará realmente un minuto como lo hizo OP? – polygenelubricants

+4

@poly: Esperará un minuto como lo pidió OP. The [Timer # scheduleAtFixedRate()] (http://java.sun.com/javase/6/docs/api/java/util/Timer.html#scheduleAtFixedRate%28java.util.TimerTask,%20long,%20long%29) hace lo que dices. – BalusC

+3

@BalusC: ¡Ah, interesante! 'schedule' se ejecuta con un retraso fijo entre ejecuciones, y' scheduleAtFixedRate' se ejecuta a intervalos fijos. ¡Bonito! – polygenelubricants

2

ScheduledExecutorService

El Answer by Lee está cerca, pero sólo se ejecuta una vez. La pregunta parece estar pidiendo ejecutarse indefinidamente hasta que un estado externo cambie (hasta que cambie la respuesta de un sitio web/servicio).

La interfaz ScheduledExecutorService es parte del paquete java.util.concurrent integrado en Java 5 y posterior como un reemplazo más moderno para la antigua clase Timer.

Aquí hay un ejemplo completo. Llame al scheduleAtFixedRate o scheduleWithFixedDelay.

ScheduledExecutorService executor = Executors.newScheduledThreadPool (1); 

Runnable r = new Runnable() { 
    @Override 
    public void run() { 
     try { // Always wrap your Runnable with a try-catch as any uncaught Exception causes the ScheduledExecutorService to silently terminate. 
      System.out.println ("Now: " + Instant.now()); // Our task at hand in this example: Capturing the current moment in UTC. 
      if (Boolean.FALSE) { // Add your Boolean test here to see if the external task is fonud to be completed, as described in this Question. 
       executor.shutdown(); // 'shutdown' politely asks ScheduledExecutorService to terminate after previously submitted tasks are executed. 
      } 

     } catch (Exception e) { 
      System.out.println ("Oops, uncaught Exception surfaced at Runnable in ScheduledExecutorService."); 
     } 
    } 
}; 

try { 
    executor.scheduleAtFixedRate (r , 0L , 5L , TimeUnit.SECONDS); // (runnable , initialDelay , period , TimeUnit) 
    Thread.sleep (TimeUnit.MINUTES.toMillis (1L)); // Let things run a minute to witness the background thread working. 
} catch (InterruptedException ex) { 
    Logger.getLogger (App.class.getName()).log (Level.SEVERE , null , ex); 
} finally { 
    System.out.println ("ScheduledExecutorService expiring. Politely asking ScheduledExecutorService to terminate after previously submitted tasks are executed."); 
    executor.shutdown(); 
} 

esperan que la producción de esta manera:

Now: 2016-12-27T02:52:14.951Z 
Now: 2016-12-27T02:52:19.955Z 
Now: 2016-12-27T02:52:24.951Z 
Now: 2016-12-27T02:52:29.951Z 
Now: 2016-12-27T02:52:34.953Z 
Now: 2016-12-27T02:52:39.952Z 
Now: 2016-12-27T02:52:44.951Z 
Now: 2016-12-27T02:52:49.953Z 
Now: 2016-12-27T02:52:54.953Z 
Now: 2016-12-27T02:52:59.951Z 
Now: 2016-12-27T02:53:04.952Z 
Now: 2016-12-27T02:53:09.951Z 
ScheduledExecutorService expiring. Politely asking ScheduledExecutorService to terminate after previously submitted tasks are executed. 
Now: 2016-12-27T02:53:14.951Z 
Cuestiones relacionadas