ich möchte gerne dass mein Programm im Hintergrund läuft und auf eingaben wartet. Wie die Eingabe erfolgt ist erstmal egal, wird wohl irgendwie über eine GUI realisiert. Jedenfalls möchte ich dass das Programm auf einem Server im Hintergrund läuft und auf die verschiedenen Eingaben reagiert.
Im Moment habe ich das so gelöst, dass ein Thread gestartet wird und in der run() - Methode eine Endlosschleife läuft, die bei jedem Durchlauf auf neue Eingaben prüft und ggf. bearbeitet.
Das ganze ist allerdings alles andere als schön und verursacht eine volle Prozessorauslastung von 2 Kernen. Daher wollte ich mal wissen wie so der allgemeine Ansatz aussieht um ein Programm zu implementieren, dass dauerhaft läuft und auf Eingaben reagiert.
Wenigstens ein [c]Thread.yield()[/c] solltest du implementieren Sprichst du von GUI und deiner Logik in der ein und derselben Applikation? Wenn ja, dann einfach den Code auf einen Listener ausführen. Wenn nicht, dann können die SWs miteinander z.B. per Socket kommunizieren. Auch da wartet man, bis ein Client sich angemeldet hat. Meist ist eine Endlosschleife ein Designfehler.
Das ganze sieht in etwa so aus: Es existiert ein Telnet-Server zu dem ich eine Socketverbindung aufbaue. Der Thread wird dann gestartet und kommuniziert mit dem Server, also er übergibt Befehle an den Telnet-Server und holt sich die Antworten vom Server. Das ganze läuft in der Endlosschleife, sodass ich zu jeder Zeit weitere Befehle übergeben kann und dann die Antwort vom Server empfange. Die Befehle werden über die GUI übergeben. Was wäre hier ein gutes Design?
Also Antworten empfängst du sowieso immer in einem zweiten Thread, dieser ist warscheinlich mit [c]readXY()[/c] blockiert? Und auf der anderen Seite (GUI) musst du nicht immer checken, du kannst einfach ein Listener an dein Button, Textfeld, ... setzen und dann die Befehle absetzen.
Ja es laufen 2 Threads, ein Thread der Ein und Ausgaben an den Server verwaltet und ein Thread der die Ein und Ausgaben zum Client verwaltet. Blockiert wird von mir keiner von beiden. Die Endlosschleife in den beiden Threads iteriert die ganze Zeit über einen Inputstream um auf neue Eingaben zu reagieren.
Die LinkedList<String> enthält den jeweiligen Inhalt des Inputstreams als String (Entweder ein Befehl oder die Antwort vom Server, je nach Instanz). Ein neuer Befehl wird dann einfach als Inputstream hinzugefügt und von der Methode inputStreamToStringList() in die LinkedList<String> geschrieben.
Auf die Telnetverbindung solltest du etwa so hören:
Java:
String input;while((input = reader.readLine())!=null){machIrgendwas(input);// kannst es ja noch ausgeben lassen zum test ;)System.out.println("> "+ input);}
Ok, soweit hab ich die Idee verstanden, allerdings bin ich mir bei bestimmten Dingen noch nicht im Klaren. Ich würde jetzt über eine Schleife den InputStream auslesen (über einen BufferedReader mit readLine() ... wie du schon geschrieben hast). Das würde ich alles in der run() - Methode des Threads machen. In der GUI würde ich einen Listener schreiben, der auf die Eingabe reagiert. Unklar ist jetzt was ich im Listener aufrufen muss? Muss ich da einen neuen Thread instanzieren oder kann ich einen alten Thread reaktivieren (bin noch nicht so mit Threads vertraut), weil theoretisch müsste ich ja bei jeder Eingabe die run() Methode neu starten.
Sowas hab ich auch schon lange nicht mehr gebraucht, aber ich würde wohl einfach den Writer immer offen halten und immer brav flushen. Aber man kann warscheinlich genau so gut immer einen neuen erstellen. Das musst du nicht zwingend in einen neuen Thread auslagern, denn das senden sollte nicht allzu lange gehen. Aber kannst du natürlich.