2017-02-03 3 views
0

Ich habe mehrere Threads. Jeder Thread hat eine while (true) Schleife im Inneren, wo ich Zyklus für Zyklus Text hinzufüge. Ich finde keine gute Methode, die while (true) Schleife mit einem Flag so zu ändern, dass ich die Datei schließen kann, wenn ich aus dem Zyklus herauskomme. Ich möchte dies tun, wenn ich zum Beispiel etwas eintippe oder wenn ich den roten Knopf Eclipse drücke.Wie kann ich die Ausführung der While-Schleife mit einer Tastatureingabe stoppen?

Dies ist der Konstruktor (Node ist ein Thread)

public Node(Channel c, int address) { 
    my_address=address; 
    try { 
     writer = new CSVWriter(new FileWriter(my_address + "_id.csv"), ',', ' ' , ' ' ,"\n"); 
     writer2 = new CSVWriter(new FileWriter(my_address + "_label.csv"), ',', ' ' , ' ' ,"\n"); 
     String[] entries = "num#state#duration#event#condition#condition result#action1#action2#backoff value".split("#"); 
     writer.writeNext(entries); 
     writer2.writeNext(entries); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Dies ist die Schleife, in der I die Datei ändern:

while (true) { 
     //write id value 
     String id_to_split = num+"#"+fsm.current_state.nome+"#"+tempo_minore+"#"+ 
       fsm.current_transition.e.getId()+"#"+ fsm.current_transition.c.getId()+"#"+ 
       fsm.current_transition.c.getFlag()+"#"+fsm.current_transition.a.getId()+"#"+ 
       fsm.current_transition.a2.getId()+"#"+backoff; 

     String[] id_entries = id_to_split.split("#"); 
     writer.writeNext(id_entries); 

     //write name 
     String label_to_split = num+"#"+fsm.current_state.nome+"#"+tempo_minore+"#"+ 
       fsm.current_transition.e.getLabel()+"#"+fsm.current_transition.c.getLabel()+"#"+ 
       fsm.current_transition.c.getFlag()+"#"+fsm.current_transition.a.getLabel()+"#"+ 
       fsm.current_transition.a2.getLabel()+"#"+backoff; 

     String[] label_entries = label_to_split.split("#"); 

     writer2.writeNext(label_entries); 

     num++; 
} 
    closeCSVs(); 
} 

Die Methode closeCSVs():

public void closeCSVs() { 
    try { 
     writer.close(); 
     writer2.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+1

Bitte schreiben einige Code-Beispiele implementieren. –

+0

Wie wäre es, die Datei nach der Schleife zu schließen und die Schleife zu unterbrechen, wenn eine bestimmte Bedingung erfüllt ist? Welcher Zustand ist zu prüfen und wie geht es Ihnen? Ich würde den Dateistream auch nicht im Konstruktor (des Threads?) Öffnen, sondern direkt vor dem Eintritt in die Schleife, wenn das möglich ist. – Thomas

+0

Um den Code zu reparieren, um zu tun, was Sie wollen, müssen Sie höchstwahrscheinlich ändern. –

Antwort

2

Wenn ich Ihre Frage richtig verstanden, was Sie suchen ist entweder ein Try-mit-Ressourcen-Block, der wie folgt funktioniert:

try(FileReader reader = new FileReader("path")) { 
    while(true) { 
     //use resources 
    } 
} 

Sie dies mit jeder Klasse verwenden können, die das AutoClosable-Interface implementiert (im Grunde jede Klasse, die eine .close() - Methode anbietet). Die Ressource wird automatisch geschlossen, nachdem der try-Block maskiert wurde.

Gleiche Lösung verschiedener Code wäre mit einem klassischen Versuch zu wickeln und einem finally-Block, um es hinzuzufügen.

try { 
    FileReader reader = new FileReader("path"); 
    while(true) { 
     //use resources 
    } 
} finally { 
    reader.close(); 
} 
+1

Es ist eine gute Übung, dass das erste Bit des Codes auch das finally hinzufügt und den FileReader dort schließt. –

+0

@TotumusMaximus, versuchen-mit-Ressourcen wird es tun, da es 'AutoClosable' ist – AxelH

+0

Sie haben Recht. Ich würde den klassischen try-catch-finally lieber mit Ressourcen versuchen, da ich denke, dass es besser lesbar ist und ich auch festgestellt habe, dass es bei E/A besser funktioniert. Nicht sicher, ob das im Allgemeinen stimmt. – matejetz

Verwandte Themen