2017-06-14 2 views
2

J'ai besoin d'un programme par lots avec une boucle sans fin. Dans cette boucle, il fait quelque chose et attend ensuite x secondes. Maintenant, le problème, comment puis-je arrêter la boucle de l'extérieur du programme? Une option est de lire un fichier et de rompre si le s.o. écrit "STOP" à l'intérieur, mais comment est-il avec la performance si j'ouvre et ferme toujours le fichier?Boucle sans fin avec sortie contrôlée

N'est-il pas possible de démarrer un deuxième thread à l'intérieur du même runtime, par ex. définir une 'exécution' booléenne à faux ou autre chose? Voici mon code avec "stop-file".

Integer endurance = args[3] != null ? new Integer(args[3]) : new Integer(System.getProperty("endurance")); 
BufferedReader stop = new BufferedReader(new FileReader(args[4] != null ? args[4] : System.getProperty("StopFile"))); 
     while (!stop.readLine().toUpperCase().equals("STOP")) 
     { 
      doSomething(args); 
      try { 
       Thread.sleep(endurance); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
       System.exit(12); 
      } 
      stop.close(); 
      stop = new BufferedReader(new FileReader(args[4] != null ? args[4] : System.getProperty("StopFile"))); 
     } 

Répondre

0

Je l'ai fait comme précédemment dans Android. J'ai commencé la logique dans le fil de l'enfant et envoyé un signal d'interruption du fil parent. Exemple de code un peu comme ci-dessous.

class TestInterruptingThread1 extends Thread 
{ 
    public void run() 
    { 
     try 
     { 
      //doBatchLogicInLoop(); 
     } 
     catch (InterruptedException e) 
     { 
      throw new RuntimeException("Thread interrupted..." + e); 
     } 

    } 

    public static void main(String args[]) 
    { 
     TestInterruptingThread1 t1 = new TestInterruptingThread1(); 
     t1.start(); 
     boolean stopFlag = false; 
     try 
     { 
      while (stopFlag == false) 
      { 
       Thread.sleep(1000); 
       //stopFlag = readFromFile(); 
      } 
      t1.interrupt(); 
     } 
     catch (Exception e) 
     { 
      System.out.println("Exception handled " + e); 
     } 

    } 
} 
0

La seule façon que je peux penser en ce moment est d'utiliser un Socket et ont un autre processus séparés envoyer des actions à votre client. En d'autres termes, vous aurez une connexion serveur-client. Essayez this tutorial

0

Un moyen plus simple que de lire un fichier, vous pouvez vérifier l'existence d'un fichier avec exists().

File stopFile = new File(System.getProperty("StopFile")); 

while (!stopFile.exists()){ 

Bien sûr, vous voudrez probablement supprimer ce fichier après votre boucle.

stopFile.delete(); 
0

Je propose également des douilles comme Monoteq proposées. Si vous ne voulez pas utiliser Sockets, je ne lirais pas le fichier et ne rechercherais pas le contenu, mais testerais simplement son existence. Cela devrait améliorer les performances.

File f; 
while((f= new File(args[4] != null ? args[4] : System.getProperty("StopFile"))).exists()) { 
    doSomething(); 
} 
f.delete(); 

Toujours pas la plus belle solution, mais mieux que de lire le contenu du fichier.