2016-09-07 3 views
0

Je voudrais exécuter une fonction toutes les 4 secondes, et le premier ensemble de code fonctionne parfaitement bien que "test" est imprimé toutes les 4 secondes.Pourquoi mon délai scheduleAtFixedRate est-il ignoré?

ScheduledExecutorService SES = Executors.newSingleThreadScheduledExecutor(); 
      SES.scheduleAtFixedRate(new UpdateGraph(), 4, 4, TimeUnit.SECONDS); 

public class UpdateGraph implements Runnable { 
    @Override 
    public void run() { 
     Log.v("testing", "testing"); 
    } 
} 

Cependant, si j'ai pour boucler l'intérieur du runnable, « test » n'est retardé plus comme je l'ai demandé. Je comprends que le problème est avec la boucle for, mais ne parviennent pas à comprendre pourquoi?

pourrait S'il vous plaît quelqu'un donner quelques conseils =)

+0

Vous exécutez une boucle. Bien sûr, tous les fichiers numberOfFiles seront imprimés rapidement. Ils se passent sans délai entre eux. –

+0

Que suggérez-vous est la façon correcte d'introduire daly entre les éléments de numberOfFiles? – CWHsu

+0

'Thread.sleep'? –

Répondre

0

Vous devez être prudent des exceptions non rattrapées lors de l'utilisation d'un SchedulorExecutorService. Si votre UpdateGraph lève une exception lors de l'exécution, aucune autre exécution ne sera planifiée.

Je vous conseille d'emballer ce bloc dans un try/catch et d'enregistrer une éventuelle exception.

0

Si vous voulez que votre Runnable soit exécuté seulement numberOfFiles fois, un exécuteur programmé est le mauvais choix ici. Prenez plutôt un SingleThreadExecutor et faites quelque chose comme ceci:

ExecutorService executor = Executors.newSingleThreadExecutor(); 
for (int i = 0; i < numberOfFiles; i++) { 
    executor.submit(runnable); 
    try { 
     executor.awaitTermination(4L, TimeUnit.SECONDS); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
}