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?
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
).
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.schedule(yourRunnable, 1L, TimeUnit.MINUTES);
...
// when done...
executor.shutdown();
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