2017-10-19 28 views
0

J'ai le problème suivant: Je suis en train d'écrire un robot de conversation en Java et je veux appeler une méthode même x minutes. Donc, je lis un "Timer.Schedule" est ce dont j'ai besoin. Alors j'écris la méthode suivante:Java Timer.Schedule (boucle infiniti) arrêter de fonctionner

public function timerMethod() 
{ 
    int time = 10; 

    ... 

    new java.util.Timer().schedule(
     new java.util.TimerTask() { 
      @Override 
      public void run() { 
       timerMethod(); 
      } 
     }, 1000 * 60 * time // 1MSec * 1Sec * xMin 
    ); 
} 

Au début de la boucle fonctionne très bien, mais après quelques heures (je pense qu'il est après 10-15 heures) la boucle ne fonctionnent plus ... Je ne sais pas pourquoi je ne fonctionnent pas et ne pas obtenir un message d'erreur :(

quelqu'un peut me aider pleace ???

+0

Est-il possible qu'une exception soit lancée dans 'timerMethod()'? Essayez d'entourer l'appel avec 'try'' catch' et log/print tous les détails de l'exception levée pour éliminer cette possibilité, –

+0

j'essaie mais aucune exception ... le terminal n'affiche aucune erreur ou exception ... – padhie

Répondre

0

vous voulez code à exécuter pour x minutes, correct?

Si oui, convertir le temps que vous voulez le code à exécuter en millisecondes comme ceci: 1 minute = 60000 ms. Il existe une méthode appelée System.currentTimeMillis(), qui retournera une valeur de milisecondes à partir de la date EPOCH (1er janvier 1970).

Vous pouvez utiliser une boucle while comme ceci:

`

int msTime = 60000; //1 Minute = 60000 MS 
int doUntil = ms + System.currentTimeMillis(); //1 minute 
while(System.currentTimeMillis() != doUntil) 
{ 
    //Code here 
    System.out.println(¨Hello World¨); //This will print Ḧello World for 60000ms 

} 
+0

voulez-vous dire ce code au lieu de mon Timer(). Schedule()? – padhie

0

Mmm bien d'abord, vous pouvez arrêter instancier plusieurs fois la variable java.util.Timer(). Vous en avez seulement besoin en tant qu'attribut de la classe. Le timerTask est le seul qui devrait être réinstancié.

private Timer timer = new Timer(); 

Maintenant, entourer votre code dans la fonction d'exécution avec try/catch:

  public void run() { 
      try { 
       timerMethod(); 
      } catch(InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

Demandez-vous que timerMethod juste une fois? Vous pouvez également ajouter à ce code des impressions afin de vérifier chaque fois que vous reprogrammez votre fonction et lorsque vous exécutez votre méthode.

+0

Essayez/Catch j'ai essayé mais rien d'exception ou d'erreur ... J'ai 3 autres minuteries, puis-je utiliser le même objet de minuterie ou dois-je faire pour chaque minuteur un objet propre? – padhie