Wie lässt sich eine einfache Stoppuhr auf der Konsole realisieren?

Eine Stoppuhr wird ein einem gesonderten Thread ausgeführt, der durch Eingaben auf der Konsole gestartet und gestoppt werden kann.

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.