So verzögern Sie die Codeausführung in Java

1. Einleitung

Es ist relativ üblich, dass Java-Programme eine Verzögerung oder Pause in ihrem Betrieb hinzufügen. Dies kann nützlich sein, um Aufgaben zu stimulieren oder die Ausführung anzuhalten, bis eine andere Aufgabe abgeschlossen ist.

In diesem Tutorial werden zwei Möglichkeiten zum Implementieren von Verzögerungen in Java beschrieben.

2. Ein Thread- basierter Ansatz

Wenn ein Java-Programm ausgeführt wird, wird ein Prozess erzeugt , der auf dem Hostcomputer ausgeführt wird. Dieser Prozess enthält mindestens einen Thread - den Hauptthread - in dem das Programm ausgeführt wird. Darüber hinaus ermöglicht Java Multithreading, mit dem Anwendungen neue Threads erstellen können, die parallel oder asynchron zum Hauptthread ausgeführt werden.

2.1. Verwenden von Thread.sleep

Eine schnelle und schmutzige Möglichkeit, in Java eine Pause einzulegen, besteht darin, den aktuellen Thread anzuweisen, für eine bestimmte Zeitspanne in den Ruhezustand zu wechseln. Dies kann mit Thread.sleep (Millisekunden) erfolgen :

try { Thread.sleep(secondsToSleep * 1000); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); }

Es wird empfohlen, die Sleep- Methode in einen Try / Catch-Block zu packen, falls ein anderer Thread den Sleeping-Thread unterbricht. In diesem Fall fangen wir die InterruptedException ab und unterbrechen den aktuellen Thread explizit, damit er später abgefangen und verarbeitet werden kann. Dies ist in einem Multithread-Programm wichtiger, in einem Single-Thread-Programm jedoch immer noch eine gute Vorgehensweise, falls wir später weitere Threads hinzufügen.

2.2. Verwenden von TimeUnit.sleep

Zur besseren Lesbarkeit können wir verwenden TimeUnit.XXX.sleep (y) , wobei XXX die Zeiteinheit zu schlafen ist für ( SEKUNDEN , MINUTEN , etc.), und y ist die Anzahl dieser Einheit zu schlafen. Dies verwendet Thread.sleep hinter den Kulissen. Hier ist ein Beispiel für die TimeUnit- Syntax:

try { TimeUnit.SECONDS.sleep(secondsToSleep); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); }

Die Verwendung dieser threadbasierten Methoden hat jedoch einige Nachteile :

  • Die Schlafzeiten sind nicht genau, insbesondere wenn kleinere Zeitinkremente wie Millisekunden und Nanosekunden verwendet werden
  • Bei Verwendung innerhalb von Schleifen driftet der Ruhezustand aufgrund anderer Codeausführungen geringfügig zwischen Schleifeniterationen, sodass die Ausführungszeit nach vielen Iterationen ungenau werden kann

3. Ein ExecutorService- basierter Ansatz

Java bietet die ScheduledExecutorService- Schnittstelle, eine robustere und präzisere Lösung. Diese Schnittstelle kann festlegen, dass Code nach einer bestimmten Verzögerung oder in festgelegten Zeitintervallen einmal ausgeführt wird.

Um einen Code nach einer Verzögerung einmal auszuführen, können Sie die Schedule- Methode verwenden:

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); executorService.schedule(Classname::someTask, delayInSeconds, TimeUnit.SECONDS);

Im Teil Classname :: someTask geben wir die Methode an, die nach der Verzögerung ausgeführt wird:

  • someTask ist der Name der Methode, die wir ausführen möchten
  • Klassenname ist der Name der Klasse, die die someTask- Methode enthält

Um eine Aufgabe in festgelegten Zeitintervallen auszuführen, können Sie die Methode schedAtFixedRate verwenden:

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); executorService.scheduleAtFixedRate(Classname::someTask, 0, delayInSeconds, TimeUnit.SECONDS);

Dadurch wird die someTask- Methode wiederholt aufgerufen , und zwischen jedem Aufruf wird eine Verzögerung von Sekunden angegeben .

Die ScheduledExecutorService- Methode ermöglicht nicht nur mehr Zeitoptionen, sondern liefert auch genauere Zeitintervalle, da sie Probleme mit der Drift verhindert.

4. Fazit

In diesem Artikel haben wir zwei Methoden zum Erstellen von Verzögerungen in Java-Programmen erläutert.

Den vollständigen Code für diesen Artikel finden Sie auf Github. Dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein.