Heim  >  Artikel  >  Java  >  Was ist ein Thread-Interrupt? Detaillierte Einführung in die Java-Thread-Unterbrechung (mit Beispielen)

Was ist ein Thread-Interrupt? Detaillierte Einführung in die Java-Thread-Unterbrechung (mit Beispielen)

不言
不言nach vorne
2018-09-27 16:38:323108Durchsuche

In diesem Artikel erfahren Sie, was eine Thread-Unterbrechung ist. Die ausführliche Einführung in die Java-Thread-Unterbrechung hat einen gewissen Referenzwert. Ich hoffe, dass sie für Sie hilfreich ist.

Jeder sollte mit dem folgenden fehlerhaften Code vertraut sein, um eine Thread-Interrupt-Ausnahme abzufangen oder auszulösen, das heißt, jemand stürmt herein und weckt Sie, während Sie schlafen.

try {
    Thread.sleep(3000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

Nachdem der Thread zu diesem Zeitpunkt unterbrochen wurde, wird der Code weiter ausgeführt oder eine Ausnahme ausgelöst, um den Vorgang zu beenden. Dies ist nicht die Funktion zum Unterbrechen des Threads, die wir benötigen.

Was genau ist ein Thread-Interrupt?

Thread-Unterbrechung bedeutet, dass der Thread während seiner Ausführung von anderen Threads unterbrochen wird. Der größte Unterschied zwischen ihm und Stop besteht darin, dass Stop das Beenden des Threads durch das System erzwingt, während Thread-Unterbrechung ein Unterbrechungssignal an sendet Wenn der Ziel-Thread das Thread-Interrupt-Signal nicht empfängt und der Thread nicht beendet wird, wird er vom Ziel-Thread bestimmt.

Werfen wir einen Blick auf die drei wichtigsten Methoden zur Thread-Unterbrechung. Sie stammen alle aus der Thread-Klasse!

1. java.lang.Thread#interrupt

Unterbrechen Sie den Ziel-Thread, senden Sie ein Interrupt-Signal an den Ziel-Thread und der Thread wird als unterbrochen markiert.

2. java.lang.Thread#isInterrupted()

Bestimmt, ob der Zielthread unterbrochen ist, und die Unterbrechungsmarkierung wird nicht gelöscht.

3. java.lang.Thread#interrupted

Um festzustellen, ob der Zielthread unterbrochen wurde, wird die Unterbrechungsmarkierung gelöscht.

Thread-Interrupt in Aktion

Lassen Sie uns anhand eines Beispiels demonstrieren, wie Thread-Interrupt verwendet wird!

Beispiel 1 (Unterbrechung fehlgeschlagen)

/**
 * 微信公众号:Java技术栈
 */
private static void test1() {
    Thread thread = new Thread(() -> {
        while (true) {
            Thread.yield();
        }
    });
    thread.start();
    thread.interrupt();
}

Wird der Thread in Beispiel 1 unterbrochen? Antwort: Nein, denn obwohl ein Interrupt-Signal an den Thread gesendet wird, gibt es im Programm keine Logik, um auf das Interrupt-Signal zu reagieren, sodass das Programm in keiner Weise reagiert.

Beispiel 2: (Unterbrechung erfolgreich)

/**
 * 微信公众号:Java技术栈
 */
private static void test2() {
    Thread thread = new Thread(() -> {
        while (true) {
            Thread.yield();

            // 响应中断
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("Java技术栈线程被中断,程序退出。");
                return;
            }
        }
    });
    thread.start();
    thread.interrupt();
}

Wir haben in Beispiel 2 Logik hinzugefügt, um auf Interrupts zu reagieren. Das Programm kehrt zurück und wird beendet, nachdem es das Interrupt-Signal empfangen und ausgedruckt hat die Informationen.

Beispiel 3 (Unterbrechung fehlgeschlagen)

/**
 * 微信公众号:Java技术栈
 */
private static void test3() throws InterruptedException {
    Thread thread = new Thread(() -> {
        while (true) {
            // 响应中断
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("Java技术栈线程被中断,程序退出。");
                return;
            }

            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                System.out.println("Java技术栈线程休眠被中断,程序退出。");
            }
        }
    });
    thread.start();
    Thread.sleep(2000);
    thread.interrupt();
}

Beispiel 3 Sleep()-Methode wurde unterbrochen und ausgegeben Java技术栈线程休眠被中断,程序退出。 Das Programm läuft weiter... Warum?

Sehen Sie sich den Quellcode von Sleep an:

Was ist ein Thread-Interrupt? Detaillierte Einführung in die Java-Thread-Unterbrechung (mit Beispielen)

Es ist ersichtlich, dass die Methode sleep() die Interrupt-Markierung löscht Nach der Unterbrechung läuft die Schleife also weiter. .

Beispiel 4 (Unterbrechung erfolgreich)

/**
 * 微信公众号:Java技术栈
 */
private static void test4() throws InterruptedException {
    Thread thread = new Thread(() -> {
        while (true) {
            // 响应中断
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("Java技术栈线程被中断,程序退出。");
                return;
            }

            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                System.out.println("Java技术栈线程休眠被中断,程序退出。");
                Thread.currentThread().interrupt();
            }
        }
    });
    thread.start();
    Thread.sleep(2000);
    thread.interrupt();
}

Beispiel 4 gibt alle Informationen aus und wird normal beendet. Unterbrechen Sie einfach den aktuellen Status manuell erneut, nachdem die Methode sleep() unterbrochen wurde und die Markierung wird gelöscht. Anschließend empfängt das Programm das Interrupt-Signal und kehrt zum Beenden zurück.

Durch die oben genannten 4 Interrupt-Beispiele glaube ich, dass Sie ein umfassendes Verständnis des Konzepts von Java-Thread-Interrupts haben.

Das obige ist der detaillierte Inhalt vonWas ist ein Thread-Interrupt? Detaillierte Einführung in die Java-Thread-Unterbrechung (mit Beispielen). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen

In Verbindung stehende Artikel

Mehr sehen