2017-10-13 29 views
1

En faisant une boucle for, je voudrais contrôler combien de temps il faut pour «rafraîchir» la boucle, et j'ai pensé que je pouvais le faire avec une minuterie.
Mon seul problème est que la minuterie continue de fonctionner comme une boucle for - répétant et répétant et répétant - donc elle empêche la boucle for de se répéter, ce qui n'est pas ce que je veux.
Mon pour le code de la boucle est ici:Comment utiliser une minuterie pour ralentir une boucle for-down

for(int i=0; i < 200; i += 4){ 
    System.out.println("Hopefully will only run once...per 5 secs"); 
    new java.util.Timer().schedule( 
     new java.util.TimerTask() { 
      @Override 
      public void run() { 

      } 
     }, 
     5000 // 5 sec buffer, but never stops buffering 
    ); 
} 

Répondre

2

Je pense que vous cherchez quelque chose comme ceci:

for(int i=0; i < 200; i += 4){ 
    System.out.println("Hopefully will only run once...per 5 secs"); 
    try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

C'est une belle solution simple mais le fil dort et ne fait pas quelque chose d'utile pour la plupart du temps. C'est bien pour la plupart des cas, mais une solution plus efficace serait d'utiliser un ScheduledExecutorService, ce qui est comme le Timer que vous avez essayé, mais plus moderne.

Voici une esquisse de la façon dont cela pourrait fonctionner:

ScheduledExecutorService exec = Executors.newScheduledThreadPool(1); 

AtomicInteger i = new AtomicInteger(0); 
exec.scheduleAtFixedRate(() -> { 
    int j = i.getAndAdd(4); 
    if (j >= 200) { 
     exec.shutdownNow(); 
     return; 
    } 

    System.out.println(j); //Will print 0,4,8 etc.. Once every 5 seconds 
    //Do stuff 
}, 0, 5, TimeUnit.SECONDS); 
+0

Je ne pensais pas 'Thread.sleep()' ' –

+0

scheduleAtFixedRate' est en effet le chemin à parcourir! – alfasin

0

Utilisez ce code dans votre for-loop

try { 
    Thread.sleep(5000); 
} catch(InterruptedException ex) { 
    ex.printStackTrace(); 
}