Heim  >  Artikel  >  Java  >  Was ist Thread-Interrupt in Java? Welche Probleme verursacht eine Java-Thread-Unterbrechung?

Was ist Thread-Interrupt in Java? Welche Probleme verursacht eine Java-Thread-Unterbrechung?

不言
不言Original
2018-09-20 15:00:023444Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Frage, was eine Thread-Unterbrechung in Java ist. Welche Probleme verursacht eine Java-Thread-Unterbrechung? Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird Ihnen hilfreich sein.

Was ist ein Thread-Interrupt?

Tatsächlich gibt es in unserem Java-Programm mehr als einen Ausführungsthread. Erst wenn alle Threads abgeschlossen sind, gilt das Java-Programm als abgeschlossen. Die offizielle Beschreibung lautet wie folgt: Dieses Java-Programm kann beendet werden, wenn die Ausführung aller Nicht-Daemon-Threads beendet ist oder wenn einer der Threads die Methode System.exit() aufruft.

Anwendungsszenarien für Thread-Unterbrechungen

Lassen Sie uns zunächst ein Beispiel nennen. Wir laden beispielsweise einen Blockbuster von mehr als 500 Millionen herunter und klicken, um den Download zu starten Zum Starten eines Threads. Allerdings ist unsere Internetgeschwindigkeit derzeit nicht sehr hoch. Als junger Mann kann ich nicht länger warten Unser erster Vorgang besteht zu diesem Zeitpunkt darin, den Download zu beenden. Dieser Vorgang zum Herunterladen von Dateien ist tatsächlich näher am Programm. Zu diesem Zeitpunkt müssen wir den Thread unterbrechen.

Lassen Sie uns als nächstes den Download-Code schreiben und sehen, wie man einen Thread unterbricht. Hier habe ich bereits angenommen, dass Sie das Erstellen eines Threads beherrschen Rufen Sie zuerst die Systemzeit ab und betreten Sie dann die Schleife, um jedes Mal die Systemzeit abzurufen. Wenn die Zeit 10 Sekunden überschreitet, wird der Thread unterbrochen und der Download gestoppt:

public void run() {

       int number = 0;

       // 记录程序开始的时间
       Long start = System.currentTimeMillis();

       while (true) {

           // 每次执行一次结束的时间
           Long end = System.currentTimeMillis();

           // 获取时间差
           Long interval = end - start;

           // 如果时间超过了10秒,那么我们就结束下载
           if (interval >= 10000) {
               // 中断线程
               interrupted();
               System.err.println("太慢了,我不下了");
               return;
           } else if (number >= 500) {
               System.out.println("文件下载完成");
               // 中断线程
               interrupted();
               return;
           }

           number++;
           System.out.println("已下载" + number + "M");

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

So unterbrechen Sie einen Thread

Die Thread-Klasse stellt uns eine Methode zur Verfügung, um einen Thread zu unterbrechen:

public static boolean interrupted() { 
      return currentThread().isInterrupted(true);
   }

Diese Methode besteht darin, zu überprüfen, ob die Unterbrechung den Wert „true“ zurückgibt, und die Nichtunterbrechung gibt „false“ zurück.

private native boolean isInterrupted(boolean ClearInterrupted);

Durch einen Blick auf den Quellcode können wir feststellen, dass die Unterbrechung erfolgt Der Thread ruft die Methode auf, um zu überprüfen, ob der Thread unterbrochen ist, und legt den Wert auf true fest. Wenn Sie zu diesem Zeitpunkt die Methode aufrufen, um zu überprüfen, ob der Thread unterbrochen ist, wird true zurückgegeben.

Hier muss jeder auf ein Problem achten: Die Methode Thread.interrupted() ändert nur den Status des aktuellen Threads, um ihm mitzuteilen, dass er unterbrochen ist, aber bei nicht blockierten Threads ändert sie nur die Unterbrechung Status, das heißt, Thread.isInterrupted () gibt true zurück. Für Threads in einem aufhebbaren Blockierungsstatus, z. B. Threads, die auf diese Funktionen warten, Thread.sleep (), löst dieser Thread nach dem Empfang des Interrupt-Signals und des Interrupts eine InterruptedException aus Der Status wird gleichzeitig auf „true“ gesetzt.

Der Grund für die durch Thread-Schlaf verursachte InterruptedException

Tatsächlich hat jeder ein wenig Verständnis dafür, also werde ich ein falsches Beispiel schreiben Lösen Sie dieses Problem gründlich. Finden Sie es heraus:

public void run() {

       int number = 0;

       while (true) {
           // 检查线程是否被中断,中断就停止下载
           if (isInterrupted()) {

               System.err.println("太慢了,我不下了");
               return;
           } else if (number >= 500) {
               System.out.println("下载完成");
               return;
           }

           number++;
           System.out.println("已下载" + number + "M");

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

Das ist unser Hauptprogramm, warten Sie 10 Sekunden und unterbrechen Sie dann den Thread

public static void main(String[] args) throws InterruptedException {

       Thread thread = new PrimeGenerator();

       // 启动线程
       thread.start();

       // 等待10秒后中断线程
       Thread.sleep(1000);

       // 中断线程
       thread.interrupt();
   }

Es sieht aus wie ein normales Programm, ist es aber nicht Was Sie sehen, ist dieser Code, der eine InterruptedException auslöst. Lassen Sie uns den Grund analysieren.

Hier müssen wir zunächst verstehen, dass die Thread.interrupt()-Methode einen laufenden Thread nicht mehr unterbricht Da die CPU zu diesem Zeitpunkt ausgelastet ist, müssen wir 10 Sekunden warten, bis die Downloadgeschwindigkeit erreicht ist Zu diesem Zeitpunkt unterbricht der Aufruf der Thread.interrupt()-Methode den Thread, aber der Ruhezustand in der run()-Methode wird aufgrund der Unterbrechung weiterhin ausgeführt Wenn Thread.sleep() erneut ausgeführt wird, wird eine InterruptedException ausgelöst, da der aktuelle Thread unterbrochen wurde.

Haben Sie den Grund für diese Ausnahme verstanden? Darüber hinaus gibt es zwei weitere Gründe, warum Threads InterruptedException-Ausnahmen generieren. Die unsachgemäße Verwendung der Methoden wait() und join() kann ebenfalls dazu führen, dass Threads diese Ausnahme auslösen.

Zwei Möglichkeiten, um zu überprüfen, ob ein Thread unterbrochen ist

Es gibt eine Methode interrupted() in der Thread-Klasse, mit der überprüft werden kann, wann der aktuelle Thread unterbrochen ist Mit der Methode isInterrupted( ) kann überprüft werden, ob der aktuelle Thread unterbrochen wurde.

Die zugrunde liegende Methode zum Unterbrechen eines Threads besteht darin, diese Eigenschaft auf true zu setzen, und die Methode isInterrupted() gibt nur diesen Eigenschaftswert zurück.

Ein Unterschied zwischen diesen beiden Methoden besteht darin, dass isInterrupted() den Attributwert von interrupted() nicht ändern kann, die interrupted()-Methode jedoch den Attributwert von interrupted ändern kann, Daher empfehlen wir bei der Bestimmung, wann ein Thread unterbrochen wird, die Verwendung von isInterrupted().

Das obige ist der detaillierte Inhalt vonWas ist Thread-Interrupt in Java? Welche Probleme verursacht eine Java-Thread-Unterbrechung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn