web-dev-qa-db-fra.com

Comment sortir d'une boucle while après un certain temps?

J'ai une boucle while et je veux qu'elle sorte après un certain temps.

Par exemple:

while(condition and 10 sec has not passed){

}
11
Roland
long startTime = System.currentTimeMillis(); //fetch starting time
while(false||(System.currentTimeMillis()-startTime)<10000)
{
    // do something
}

Ainsi la déclaration

(System.currentTimeMillis()-startTime)<10000

Vérifie s'il s'est écoulé 10 secondes ou 10 000 millisecondes depuis le début de la boucle.

MODIFIER

Comme @Julien l'a souligné, cela peut échouer si votre bloc de code dans la boucle while prend beaucoup de temps. Ainsi, utiliser ExecutorService serait une bonne option.

Tout d'abord, nous devrions implémenter Runnable

class MyTask implements Runnable
{
    public void run() { 
        // add your code here
    }
}

Ensuite, nous pouvons utiliser ExecutorService comme ceci,

ExecutorService executor = Executors.newSingleThreadExecutor();
executor.invokeAll(Arrays.asList(new MyTask()), 10, TimeUnit.SECONDS); // Timeout of 10 seconds.
executor.shutdown();
26
Ankit Rustagi

Les solutions proposées et acceptées ne feront pas l'affaire.

Cela n'arrêtera pas la boucle après 10 secondes. Imaginez que le code dans votre boucle prenne 20 secondes pour être traité et qu'il soit appelé à 9,9 secondes. Votre code se fermerait après 29,9 secondes d'exécution.

Si vous voulez arrêter exactement après 10 secondes, vous devez exécuter votre code dans un thread externe que vous supprimerez après un certain délai.

Les solutions existantes ont déjà été proposées ici et

11
Julien

Quelque chose comme: 

long start_time = System.currentTimeMillis();
long wait_time = 10000;
long end_time = start_time + wait_time;

while (System.currentTimeMillis() < end_time) {
   //..
}

Devrait faire l'affaire. Si vous avez également besoin d'autres conditions, ajoutez-les simplement à l'instruction while.

7
Choc13

Ne pas utiliser ce

System.currentTimeMillis()-startTime

Cela pourrait causer un blocage du changement d’heure de la machine hôte ........ Mieux vaut utiliser cette méthode:

Integer i = 0;
            try {
                while (condition && i++ < 100) {
                    Thread.sleep(100);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

(100 * 100 = délai d'attente de 10 secondes)

0
delfer