Manchmal müssen wir den ausführenden Thread zu einem bestimmten Zeitpunkt unterbrechen. Zum Beispiel ein Thread, der den Status eines Sensors einmal pro Minute überprüft. In der restlichen Zeit muss der Thread nichts tun. Während dieser Zeit muss der Thread keine Ressourcen des Computers nutzen. Nach Ablauf dieser Zeitspanne und wenn die Java Virtual Machine den Thread plant, wird die Ausführung des Threads fortgesetzt. Dazu können Sie die Methode „sleep()“ der Klasse „Thread“ verwenden. Diese Methode verzögert die Ausführung des Threads durch den Ruhezustand, und der Integer-Typ-Parameter gibt die Anzahl der Millisekunden an, die er in den Ruhezustand versetzen soll. Wenn die Methode sleep() aufgerufen wird und die Ruhezeit abgelaufen ist, weist die Java Virtual Machine dem Thread CPU-Laufzeit zu und der Thread wird weiterhin ausgeführt.
Eine andere Möglichkeit, die Methode sleep() zu verwenden, sind die Elemente des Aufzählungstyps TimeUnit. Diese Methode verwendet die Methode „sleep()“ von Thread, um den aktuellen Thread in den Ruhezustand zu versetzen. Sie kann die angegebene Zeiteinheit als Parameter akzeptieren und in die entsprechende Anzahl von Millisekunden umwandeln.
In diesem Abschnitt entwickeln wir ein Programm, das die Methode „sleep()“ verwendet, um jede Sekunde die aktuelle Uhrzeit auszugeben.
weiß es
Befolgen Sie die unten gezeigten Schritte, um die Beispiele in diesem Abschnitt umzusetzen.
1. Erstellen Sie eine Klasse mit dem Namen FileClock und implementieren Sie die Runnable-Schnittstelle. Der Code lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
Die öffentliche Klasse FileClock implementiert Runnable {
2. Implementieren Sie die run()-Methode. Der Code lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
@Override
public void run() {
3. Schreiben Sie eine Schleife, die in jeder Iteration zehnmal durchlaufen wird. Erstellen Sie ein Date-Objekt und geben Sie es auf der Konsole aus. Rufen Sie dann die Methode „sleep()“ über die Eigenschaft „SECONDS“ von TimeUtil auf, um die Ausführung des Threads um eine Sekunde zu verzögern. Ich dachte, die Methode sleep() würde eine InterruptedException auslösen. Daher müssen wir noch ein paar Codezeilen schreiben, um Ausnahmen abzufangen. Wenn ein Thread unterbrochen werden kann, empfiehlt es sich immer, die im Thread verwendeten Ressourcen freizugeben oder zu schließen. Der Code lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
for (int i = 0; i < 10; i++) {
System.out.printf("%s/n", new Date());
versuchen {
TimeUnit.SECONDS.sleep(1);
} Catch (InterruptedException e) {
System.out.printf("Die FileClock wurde unterbrochen./n");
}
}
4. Wir haben bereits eine gut implementierte Thread-Klasse. Nun implementieren wir die Hauptklasse. Erstellen Sie eine Klasse mit dem Namen FileMain und implementieren Sie die Methode main(). Der Code lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
öffentliche Klasse FileMain {
public static void main(String[] args) {
5. Erstellen Sie ein FileClock-Objekt und anschließend einen Thread zum Ausführen von Aufgaben. Dann starten Sie den Thread. Der Code lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
FileClock-Uhr = new FileClock();
Thread thread = new Thread(clock);
thread.start();
6. Rufen Sie im Hauptthread die Methode sleep() über die SECONDS-Eigenschaft von TimeUtil auf, um fünf Sekunden zu warten. Der Code lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
versuchen {
TimeUnit.SECONDS.sleep(5);
} Catch (InterruptedException e) {
e.printStackTrace();
}
7. Unterbrechen Sie den FileClock-Thread. Der Code lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
thread.interrupt();
8. Führen Sie das Beispiel aus und überprüfen Sie den Ausführungseffekt.
weiß warum
Wenn Sie dieses Programm ausführen, werden Sie feststellen, wie das Programm jede Sekunde das Datumsobjekt druckt und wie der Thread unterbrochen wird.
Wenn die Methode „sleep()“ aufgerufen wird, verlässt der Thread die CPU und stoppt die Ausführung für einen bestimmten Zeitraum. Während dieser Zeit benötigt der Thread die CPU nicht mehr, sodass die CPU andere Aufgaben ausführen kann.
Wenn ein schlafender Thread unterbrochen wird, wird sofort eine InterruptedException ausgelöst, anstatt zu warten, bis der Schlaf endet.
niemals enden
In der Java-Parallelitäts-API gibt es eine weitere Methode, mit der Threads die CPU aufgeben können. Dies ist die Methode yield(). Durch den Aufruf dieser Methode wird eine Nachricht an die Java Virtual Machine gesendet, die angibt, dass der Thread die CPU an andere Threads abgeben kann. Die Java Virtual Machine garantiert nicht, auf diese Anfrage zu antworten. Normalerweise wird diese Methode nur beim Debuggen des Programms verwendet.
Nutzen Sie die Lehre
Dieser Artikel wurde aus dem „Java 7 Concurrency Cookbook“ übersetzt (D Gua Ge hat ihn als „Java7 Concurrency Beispielsammlung“ gestohlen) und dient nur als Lernmaterial. Es darf ohne Genehmigung nicht für kommerzielle Zwecke verwendet werden.
Kleiner Erfolg
Die vollständige Version des in diesem Abschnitt verwendeten Beispielcodes.
Der vollständige Code der FileClock-Klasse lautet wie folgt:
Paket com.diguage.books.concurrencycookbook.chapter1.recipe5;
import java.util.Date;
import java.util.concurrent.TimeUnit;
/**
* Drucken Sie jede Sekunde das aktuelle Datum und die aktuelle Uhrzeit auf der Konsole aus.
* Datum: 18.09.2013
* Zeit: 23:11
*/
Die öffentliche Klasse FileClock implementiert Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.printf("%s/n", new Date());
versuchen {
TimeUnit.SECONDS.sleep(1);
} Catch (InterruptedException e) {
System.out.printf("Die FileClock wurde unterbrochen./n");
}
}
}
Vollständiger Code der FileMain-Klasse
Kopieren Sie den Codecode wie folgt:
Paket com.diguage.books.concurrencycookbook.chapter1.recipe5;
import java.util.concurrent.TimeUnit;
/**
* Demo-Thread schlafen und fortsetzen
* Datum: 19.09.2013
* Zeit: 00:29
*/
öffentliche Klasse FileMain {
public static void main(String[] args) {
FileClock-Uhr = new FileClock();
Thread thread = new Thread(clock);
thread.start();
versuchen {
TimeUnit.SECONDS.sleep(5);
} Catch (InterruptedException e) {
e.printStackTrace();
}
thread.interrupt();
}
}