web-dev-qa-db-fra.com

Retard/attente Java

Comment puis-je retarder une boucle while à des intervalles de 1 seconde sans ralentir tout le code/l'ordinateur sur lequel il s'exécute sur le délai d'une seconde (juste la petite boucle).

12
Gray Adams

Thread.sleep(1000); // do nothing for 1000 miliseconds (1 second)

26
COD3BOY

Il semble que votre boucle fonctionne sur le fil principal et si vous faites sleep sur ce fil, l'application sera suspendue (puisqu'il n'y a qu'un seul fil qui a été suspendu), pour résoudre ce problème, vous pouvez mettre ce code dans la nouvelle Thread qui fonctionne en parallèle

try{

  Thread.sleep(1000);
}catch(InterruptedException ex){
  //do stuff
}
11
Jigar Joshi

Mes moyens simples de retarder une boucle.

J'ai déjà mis les codes ici après avoir omis de suivre les normes de stackoverflow.

//1st way: Thread.sleep : Less efficient compared to 2nd
try {
  while (true) {//Or any Loops
   //Do Something
   Thread.sleep(sleeptime);//Sample: Thread.sleep(1000); 1 second sleep
  }
 } catch (InterruptedException ex) {
   //SomeFishCatching
 }
//================================== Thread.sleep


//2nd way: Object lock waiting = Most efficient due to Object level Sync.
Object obj = new Object();
 try {
  synchronized (obj) {
   while (true) {//Or any Loops
   //Do Something
   obj.wait(sleeptime);//Sample obj.wait(1000); 1 second sleep
   }
  }
 } catch (InterruptedException ex) {
   //SomeFishCatching
 }
//=============================== Object lock waiting

//3rd way:  Loop waiting = less efficient but most accurate than the two.
long expectedtime = System.currentTimeMillis();
while (true) {//Or any Loops
   while(System.currentTimeMillis() < expectedtime){
     //Empty Loop   
   }
   expectedtime += sleeptime;//Sample expectedtime += 1000; 1 second sleep
   //Do Something
}
//===================================== Loop waiting
2
D.R.Bendanillo

Comme Jigar l'a indiqué, vous pouvez utiliser un autre thread pour effectuer un travail qui peut fonctionner, dormir, etc. indépendamment des autres threads. La classe Java.util.Timer peut également vous aider, car elle peut effectuer des tâches périodiques sans que vous ayez à vous lancer dans la programmation multithread.

1
Paul Jowett