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){
}
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();
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.
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.
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)