In einem Java-Programm mit mehreren Threads wird das gesamte Programm erst beendet, wenn alle Threads die Ausführung abgeschlossen haben. (Es ist zu beachten, dass die Ausführung aller Nicht-Daemon-Threads abgeschlossen ist. Wenn ein Thread die System.exit()-Methode ausführt, wird das Programm ebenfalls beendet.) Manchmal möchten Sie die Ausführung eines Threads abbrechen, z. B. wenn Sie das Programm beenden oder eine ausgeführte Aufgabe abbrechen möchten usw.
Java bietet einen Interrupt-Mechanismus, der es uns ermöglicht, den Thread, dessen Ausführung wir beenden möchten, explizit zu unterbrechen. Eine Funktion des Interrupt-Mechanismus besteht darin, dass wir prüfen können, ob der Thread unterbrochen wurde, und dann entscheiden können, ob wir auf die Abbruchanforderung reagieren. Der Thread kann die Abbruchanforderung auch ignorieren und die Ausführung fortsetzen.
In diesem Abschnitt erstellt das von uns entwickelte Beispielprogramm einen Thread und verwendet nach fünf Sekunden den Interrupt-Mechanismus, um den Thread zwangsweise zu beenden.
weiß es
Führen Sie die folgenden Schritte aus, um das Beispielprogramm fertigzustellen.
1. Erstellen Sie eine Klasse mit dem Namen PrimeGenerator und erben Sie die Thread-Klasse. Der Code lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
öffentliche Klasse PrimeGenerator erweitert Thread {
2. Schreiben Sie die run()-Methode neu und fügen Sie der Methode eine Endlosschleife hinzu. Überprüfen Sie durch Berechnung, ob die aufeinanderfolgenden positiven ganzen Zahlen ab 1 Primzahlen sind. Wenn ja, drucken Sie es auf der Konsole aus. Der Code lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
@Override
public void run() {
lange Zahl = 1L;
while (wahr) {
if (isPrime(number)) {
System.out.printf("Number %d /tis Prime.", number);
}
3. Überprüfen Sie nach der Verarbeitung einer Zahl, ob der Thread durch Aufruf der Methode isInterrupted() unterbrochen wurde. Wenn diese Methode „true“ zurückgibt, wird ein Satz auf der Konsole ausgegeben und anschließend die Thread-Ausführung beendet. Der Code lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
if (isInterrupted()) {
System.out.println("Der Hauptgenerator wurde unterbrochen");
zurückkehren;
}
Zahl++;
}
}
4. Implementieren Sie die Methode isPrime(), die verwendet wird, um zu bestimmen, ob der Parameter eine Primzahl ist. Wenn ja, gibt sie true zurück, andernfalls gibt sie false zurück. Der Code lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
/**
* Bestimmen Sie, ob der Parameter eine Primzahl ist
*
* @param Zahl Die zu beurteilende Zahl
* @zurückkehren
*/
privater boolescher Wert isPrime(lange Zahl) {
if (Anzahl <= 2) {
return true;
}
for (int i = 2; i < number; i++) {
if ((Anzahl % i) == 0) {
return false;
}
}
return true;
}
5. Implementieren Sie nun die Hauptklasse des Beispielprogramms, die Main-Klasse und die main()-Methode. Der Code lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
öffentliche Klasse Main {
public static void main(String[] args) {
6. Erstellen Sie ein PrimeGenerator-Objekt und starten Sie den Thread. Der Code lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
Thread-Aufgabe = new PrimeGenerator();
task.start();
7. Warten Sie fünf Sekunden und beenden Sie dann den Thread. Der Code lautet wie folgt:
Kopieren Sie den Codecode wie folgt:
versuchen {
TimeUnit.SECONDS.sleep(5L);
} Catch (InterruptedException e) {
e.printStackTrace();
}
task.interrupt();
8. Führen Sie das Beispiel aus und sehen Sie sich die Ergebnisse an.
weiß warum
Unten finden Sie einen gedruckten Ausschnitt der Beispielprogrammausführung. Anhand der gedruckten Zeichen können wir sehen, wie der PrimeGenerator-Thread Informationen ausgibt und wie seine Ausführung beendet wird, wenn er erkennt, dass der Thread unterbrochen ist.
Kopieren Sie den Codecode wie folgt:
Nummer 43063 ist Prime.
Nummer 43067 ist Prime.
Nummer 43093 ist Prime.
Nummer 43103 ist Prime.
Nummer 43117 ist Prime.
Der Hauptgenerator wurde unterbrochen
Thread verfügt über eine boolesche Funktion, die anzeigt, ob der Thread unterbrochen wurde. Wenn die Methode interrupt() aufgerufen wird, wird sie auf true gesetzt. Die Methode isInterrupted() gibt den aktuellen Wert der Eigenschaft zurück.
niemals enden
Thread verfügt auch über eine Methode, um zu prüfen, ob der Thread unterbrochen ist: die statische Methode interrupted(), die prüfen kann, ob der aktuell ausgeführte Thread unterbrochen ist.
Kopieren Sie den Codecode wie folgt:
Es gibt einen großen Unterschied zwischen der Methode isInterrupted() und der Methode interrupted(). Ersteres ändert den Eigenschaftswert, ob der Thread unterbrochen wird, nicht; letzteres kann seinen Wert auf „false“ setzen. interrupted() ist eine statische Methode; es wird empfohlen, für die tägliche Entwicklung die Methode isInterrupted() zu verwenden.
Wie bereits erwähnt, kann ein Thread die Interrupt-Anfrage ignorieren und die Ausführung fortsetzen. Dies ist jedoch nicht das gewünschte Ergebnis.
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
Eine vollständige Version des gesamten im Beispielprogramm verwendeten Codes.
Der vollständige Code der PrimeGenerator-Klasse lautet wie folgt:
Paket com.diguage.books.concurrencycookbook.chapter1.recipe3;
/**
* Datum: 18.09.2013
* Zeit: 11:53
*/
öffentliche Klasse PrimeGenerator erweitert Thread {
@Override
public void run() {
lange Zahl = 1L;
while (wahr) {
if (isPrime(number)) {
System.out.printf("Number %d /tis Prime./n", number);
}
if (isInterrupted()) {
System.out.println("Der Hauptgenerator wurde unterbrochen");
zurückkehren;
}
Zahl++;
}
}
/**
* Bestimmen Sie, ob der Parameter eine Primzahl ist
*
* @param Zahl Die zu beurteilende Zahl
* @zurückkehren
*/
privater boolescher Wert isPrime(lange Zahl) {
if (Anzahl <= 2) {
return true;
}
for (int i = 2; i < number; i++) {
if ((Anzahl % i) == 0) {
return false;
}
}
return true;
}
}
Der vollständige Code der Hauptklasse
Kopieren Sie den Codecode wie folgt:
Paket com.diguage.books.concurrencycookbook.chapter1.recipe3;
import java.util.concurrent.TimeUnit;
/**
* Datum: 18.09.2013
* Zeit: 12:33
*/
öffentliche Klasse Main {
public static void main(String[] args) {
Thread-Aufgabe = new PrimeGenerator();
task.start();
versuchen {
TimeUnit.SECONDS.sleep(5L);
} Catch (InterruptedException e) {
e.printStackTrace();
}
task.interrupt();
}
}