Wie lässt sich eine einfache Stoppuhr auf der Konsole realisieren?
Das Hauptprinzip des Programms besteht darin, dass innerhalb eines Thread im Rhythmus von einer Sekunde eine Zahl hochgezählt und ausgegeben wird. Die Ausführung findet in einer Schleife statt, deren Beginn und Abbruch über eine Hilfsvariable gesteuert wird.
In der Klasse Stoppuhr
sind zwei Instanzvariablen
und, neben main()
, drei weitere Methoden
deklariert. Die Methoden start()
und stop()
setzen die boolsche Variable running
auf true
oder false
. Sie werden nach Eingabe von s
oder q
auf der Konsole in der dritten Methode steuerDieUhr()
im Rahmen einer Endlosschleife aufgerufen.
In der Variablen uhr
wird ein Thread gespeichert, der die eigentliche Stoppuhr
darstellt. In seiner run()
-Methode läuft,
abhängig vom Wert von running
, eine Schleife,
in der die lokale Variable sec
ausgegeben und
inkrementiert wird, nachdem der Thread eine Sekunde pausiert
hat.
Die ersten beiden Zeilen innerhalb des Schleifenkörpers
dienen zur Leerung der Konsole, sodass jeweils nur der aktuelle
Zähler der Stoppuhr angezeigt wird. Bei dem String \033[H\033[2J
handelt es sich um eine ANSI Escape Sequenz[1]. Sie kann
folgendermaßen aufgeschlüsselt werden:
\033 | ESC |
[H | Bewegt den Cursor an die Startposition (0,0) |
[2J | Leert das gesamte Konsolenfenster |
Es muss beachtet werden, dass bei einer IDE die Sequenz
wirkungslos bleibt und das Leeren des Konsolenfensters nicht
möglich ist. Der Aufruf von System.out.flush()
sorgt für eine vollständige Leerung des PrintStream
.
public class Stoppuhr { boolean running = false; Thread uhr = new Thread() { int sec = 0; public void run() { while (running) { System.out.print("\033[H\033[2J"); System.out.flush(); System.out.print(sec); try { Thread.sleep(1000); } catch (InterruptedException e) { } ++sec; } } }; private void steuerDieUhr() { Scanner scanner = new Scanner(System.in); String s; while (true) { s = scanner.next(); if (s.equals("q")) { stop(); scanner.close(); System.exit(0); } if (s.equals("s")) { start(); } } } public void stop() { running = false; } public void start() { running = true; uhr.start(); } public static void main(String[] args) { new Stoppuhr().steuerDieUhr(); } }
Quellen
https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797 (abgerufen: 24.05.2021)
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.