Java Boucle à chaque minute

je veux écrire une boucle en Java, les sapins démarre et qui va comme ceci:

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

    //execute code
}

je veux le faire pour qu'il n'utilise pas les ressources du système. Ce qui se passe réellement dans le code est qu'il va sur un site web et vérifie si quelque chose est fait, si ce n'est pas fait, il devrait attendre une minute de plus jusqu'à ce qu'il vérifie à nouveau, et quand il est fait, il se déplace juste. Est-ce qu'ils peuvent faire ça à java?

21
demandé sur cblupo 2010-04-24 06:31:25

4 réponses

Utiliser Thread.sleep(long millis).

provoque le thread en cours d'exécution à dormir (arrêt temporaire de l'exécution) pour le nombre spécifié de millisecondes, sous réserve de la précision et de la précision des minuteries et des ordonnanceurs du système. Le thread ne perd pas la propriété des moniteurs.

Une minute serait (60*1000) = 60000 millisecondes.


par exemple, cette boucle affichera l'heure courante une fois tous les 5 secondes:

    try {
        while (true) {
            System.out.println(new Date());
            Thread.sleep(5 * 1000);
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

Si votre période de sommeil devient trop grand pour int, calculer explicitement dans long(e.g. 1000L).

48
répondu polygenelubricants 2010-04-24 02:42:13

Vous pouvez utiliser Timer

Timer timer = new Timer();

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

Lorsque viendra le temps

  timer.cancel();

Pour l'arrêter.

42
répondu OscarRyz 2010-04-24 02:42:00
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.schedule(yourRunnable, 1L, TimeUnit.MINUTES);
...
// when done...
executor.shutdown();
11
répondu Chuk Lee 2016-05-11 00:26:07

ScheduledExecutorService

Réponse par Lee est proche, mais ne court qu'une fois. La Question semble être de demander de fonctionner indéfiniment jusqu'à ce qu'un état externe change (jusqu'à ce que la réponse d'un site web/service change).

ScheduledExecutorService l'interface fait partie du java.util.concurrent package intégré dans Java 5 et plus tard, à la plus moderne pour remplacer les anciens Timer classe.

Voici un exemple complet. Appel scheduleAtFixedRate ou 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 ();
}

Attendre la sortie comme ceci:

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
5
répondu Basil Bourque 2017-05-23 11:46:58