Je veux écrire une boucle dans Java qui démarre et va comme ceci:
while (!x){
//wait one minute or two
//execute code
}
Je veux le faire pour qu'il n'utilise pas les ressources système. Ce qui se passe réellement dans le code, c'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 encore une minute jusqu'à ce qu'il vérifie à nouveau, et quand c'est fait, il continue. Est-ce que c'est de toute façon le faire en java?
Utilisez Thread.sleep(long millis)
.
Provoque la mise en veille du thread en cours d'exécution (arrête temporairement l'exécution) pendant le nombre de millisecondes spécifié, sous réserve de la précision et de l'exactitude des temporisateurs et des planificateurs du système. Le thread ne perd la propriété d'aucun moniteur.
Une minute serait (60*1000) = 60000
millisecondes.
Par exemple, cette boucle affichera l'heure actuelle toutes 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 longue pour int
, calculez explicitement dans long
(par exemple 1000L
).
Vous pouvez utiliser Timer
Timer timer = new Timer();
timer.schedule( new TimerTask() {
public void run() {
// do your work
}
}, 0, 60*1000);
Quand vient le temps
timer.cancel();
Pour l'arrêter.
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.schedule(yourRunnable, 1L, TimeUnit.MINUTES);
...
// when done...
executor.shutdown();
ScheduledExecutorService
Réponse de Lee est proche, mais ne s'exécute qu'une seule fois. La question semble demander de s'exécuter indéfiniment jusqu'à ce qu'un état externe change (jusqu'à ce que la réponse d'un site Web/service change).
L'interface ScheduledExecutorService
fait partie de Java.util.concurrent
package intégré à Java 5 et versions ultérieures comme remplacement plus moderne de l'ancienne classe Timer
.
Voici un exemple complet. Appelez soit 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 ();
}
Attendez-vous à une sortie comme celle-ci:
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