Multithread - Input verrutscht während etwas ausgegeben wird

schemil053

Mitglied
1663512243460.png
Ich habe das Problem, dass bei meinem Java-Programm, welches Multithread ist, der Output und der Input verrutscht.
Wie kann ich das Problem lösen, dass es Beispielsweise so aussieht:
1663512323039.png

Ich würde es bevorzugen, so wenig Bibliotheken zu nutzen.
Aktuell verwende ich die Scanner-Klasse zum lesen und System.out zum schreiben.
Danke für jede Hilfe!
 
Du könntest einen expliziten Lock oder synchronized(dasselbeObjekt) verwenden, um die Codeblöcke, die Eingabe und Ausgabe machen, untereinander zu synchronisieren. Das heißt, dass du z.B. während eines Scanner.nextLine() nichts ausgeben kannst, während der Scanner auf den Input wartet.
Also:
Java:
Object lock = new Object();
(jede Ausgabestelle):
Java:
synchronized (lock) {
  System.out.println(...);
}
(jede Eingabestelle):
Java:
Scanner scanner = ...
String eingabe;
synchronized (lock) {
  eingabe = scanner.nextLine();
}
// mit eingabe was tun
 
Du könntest einen expliziten Lock oder synchronized(dasselbeObjekt) verwenden, um die Codeblöcke, die Eingabe und Ausgabe machen, untereinander zu synchronisieren. Das heißt, dass du z.B. während eines Scanner.nextLine() nichts ausgeben kannst, während der Scanner auf den Input wartet.
Das Problem ist, es soll gleichzeitig was ausgegeben werden, während gelesen wird.
 
Das Problem ist, es soll gleichzeitig was ausgegeben werden, während gelesen wird.
Das funktioniert dann nicht, weil sich ja deine Terminaleingaben dann überschneiden mit den Terminalausgaben.
Also: Das Terminal selbst kann nicht deine Eingaben an derselben Stelle halten während der Prozess Ausgaben an das Terminal sendet.

Das ist aber nur ein Anzeigeproblem des Terminals selbst. Du wirst feststellen, dass die Eingabe, die du machst, auch als solches korrekt vom Programm eingelesen wird. Das Terminal zeigt die Zeichen nur eben über mehrere Zeilen verstreut an.
 
Das funktioniert dann nicht, weil sich ja deine Terminaleingaben dann überschneiden mit den Terminalausgaben.
Also: Das Terminal selbst kann nicht deine Eingaben an derselben Stelle halten während der Prozess Ausgaben an das Terminal sendet.

Das ist aber nur ein Anzeigeproblem des Terminals selbst. Du wirst feststellen, dass die Eingabe, die du machst, auch als solches korrekt vom Programm eingelesen wird. Das Terminal zeigt die Zeichen nur eben über mehrere Zeilen verstreut an.
es gibt viele Programme, die dieses kleine Problem nicht haben, es wäre nur wichtig, dass während input reinkommt auch output rauskommt. Es ist eine Art "Konsole" die ein Webpanel besitzt und damit andere Programme managen kann
 
Das ist mit Java-Boardmitteln alleine nicht realisierbar, da du hierfür betriebssystemabhängige Funktionen nutzen musst, um das Terminal von buffered/line-mode in character/raw mode zu bringen. Dann bekommst du auch Eingaben character-weise mit und nicht nur line-buffered, so dass du dann die bis jetzt eingegebenen Character neuzeichnen und den Cursor setzen kannst, jedesmal, wenn eine Ausgabe getätigt wurde.
Mit dem default line-mode des Terminals ist das gewünschte Verhalten nicht realisierbar.
Du brauchst hierfür so etwas wie "ncurses", nur für Java.
 

Neue Themen


Zurück
Oben