Was ist der Unterschied zwischen Warten / Benachrichtigen und Warten / Interrupt?

9
%Vor%

Es scheint, dass dieser Thread beide aufwacht, wenn ein anderer Thread in diesem Thread interrupt() oder notify() aufruft. Gibt es Unterschiede zwischen den beiden?

- BEARBEITEN -

Ich weiß, dass man ein Objekt benachrichtigt, der andere unterbricht einen Thread. Aber beide führen zu der gleichen Konsequenz, das heißt, dieser Thread ist aufgewacht, also möchte ich fragen, wie sich die Konsequenzen dieser beiden Situationen unterscheiden.

    
Hải Phong 27.05.2015, 00:39
quelle

3 Antworten

3

Wenn ein Thread auf einem Monitor notify aufruft, wird ein einzelner Thread, der auf diesem Monitor wartet, aktiviert, aber welcher Thread geweckt wird, wird vom Scheduler entschieden. (Alternativ kann ein Thread notifyAll aufrufen, der alle Threads aufwarf, die auf diesen Monitor warten, dann konkurrieren alle um den Monitor, dann gehen die Verlierer zurück zum Warten.) Deshalb ist das Ziel des Anrufs anders, die Benachrichtigung wird gemacht zu dem Monitor, der dem Scheduler mitteilt, einen Thread zum Aufwecken auszuwählen.

Im Gegensatz zu notify zielt Interrupt auf einen bestimmten Thread ab. Eine Unterbrechung erfordert nicht, dass der unterbrochene Thread auf einem Monitor wartet. Damit ein Thread auf einem Monitor wartet, muss er diesen Monitor zuerst erworben haben, dann wartet er auf Meldungen, die überwachen, bis der Thread fertig ist oder unterbrochen wird.

Oracle empfiehlt, die Unterbrechung nur für die Stornierung zu verwenden. Auch die Klassen in java.util.concurrent sind so konzipiert, dass sie den Interrupt für die Löschung verwenden.

In Ihrem Beispiel ist die Unterbrechung nicht sehr effektiv, weil die Steuerung die while-Schleife nicht verlässt, der Thread muss immer noch den Zustand, auf den er wartet, überprüfen, und es gibt keine Prüfung in der while-Schleife für das Interrupt-Flag ist eingestellt. Es ist wahrscheinlich, dass der Thread, der unterbrochen wird, sofort wieder zum Warten führt.

Damit dieser Code beendet wird, sobald er unterbrochen wurde, anstatt zu warten, fügen Sie der Schleifenbedingung eine Überprüfung für den unterbrochenen Flag-Status hinzu und setzen den catch-Block auf das Interrupt-Flag (das zurückgesetzt wird, wenn die Ausnahme auftritt) geworfen):

%Vor%     
Nathan Hughes 27.05.2015, 12:53
quelle
1

Im Grunde suchen Sie nicht nach einem Unterschied im Textbuch, sondern nach einem Unterschied in ihren Anwendungsfällen.

Wie bereits erwähnt, ist das Aufwachen des Threads nicht die einzige Konsequenz, aber das Aufrufen von t1.interrupt() von Thread t2 für t1 verursacht InterruptedException im Thread t1 und das ist ein großer Unterschied zwischen Object.notify() und Thread.interrupt() .

Sie sollten verstehen, dass seine Methode Object.wait() die checked InterruptedException auslöst und Sie dazu zwingt, damit umzugehen. Object.wait .

  

InterruptedException - wenn ein Thread den aktuellen Thread unterbrochen hat   bevor oder während der aktuelle Thread auf eine Benachrichtigung gewartet hat. Das   Der unterbrochene Status des aktuellen Threads wird gelöscht, wenn dies der Fall ist   Ausnahme wird ausgelöst.

Dann sollten Sie diese Frage konsultieren, um sich ein Bild von der Handhabung dieser Ausnahme zu machen.

Der Unterschied zwischen den beiden liegt in der Tatsache, dass eine für die Inter-Thread-Kommunikation für übliche logische Programmierungs-Stuff (Warten & Melden) und andere (Interrupt) für Preemptive Thread-Cancellation / Terminierung auch in Fällen von Blockierungsoperationen ist. Sie müssen beachten, dass Java keinen Mechanismus zum präventiven Abbrechen eines Threads bietet, so dass Sie den Interrupt-Mechanismus für diesen Zweck verwenden müssen (Offensichtlich, wenn dies in Ihrem Fall erforderlich ist. Sie können diese Ausnahme sehr gut ignorieren, wenn sie nicht in Ihrem Fall anwendbar ist Fall).

Java schränkt Ihre Aktionen nicht nach InterruptedException ein und Sie können alles tun, was Sie wollen, aber es wird nicht empfohlen, es für andere Dinge als die Implementierung von Thread Cancellation Policy zu verwenden. Thread Cancellation Policy wird oft ignoriert und weniger diskutiert, wenn Programmierer Multithread-Programme schreiben und deshalb ist es schwierig, den Anwendungsfall zu verstehen.

Was macht eine API-Methode wie BlockingQueue? put (..) versucht dir zu sagen, indem du InterruptedException w \ u00e4hlst, dass sogar seine blockierende Operation preemptiv beendet werden kann. Es ist nicht notwendig, dass alle blockierenden API-Methoden Ihnen diese Möglichkeit bieten.

Abbruch / Beendigung eines Threads mit Thread.interrupt() ist kein kraftvoller, sondern kooperativer Mechanismus und ist nur eine Anfrage, kein Auftrag.

Von der Verwendung von e.printStackTrace(); wird dringend abgeraten, da dies in der Regel kein Fehler ist, wenn es beabsichtigt ist, es als Fehler zu protokollieren.

Hoffe es hilft !!

    
Sabir Khan 29.01.2017 13:56
quelle
0
  1. Die Wait-Methode wird verwendet, um einen aktuellen Thread in einem Objekt zu suspendieren. Die Wait-Methode stammt nicht von der Thread-Klasse, sondern von java.lang.Object

  2. Notify-Methode wird verwendet, um den auf das Objekt wartenden Thread aufzuwecken. Notify-Methode stammt nicht aus der Thread-Klasse, sondern aus java.lang.Object.

  3. Interrupt-Methode wird verwendet, um den aktuellen Thread anzuzeigen, der ist sollte die aktuelle Jobausführung stoppen und andere Jobs starten. Die Interrupt-Methode stammt aus der Thread-Klasse.

Sehen wir uns das Beispiel aus dem wirklichen Leben an:

Betrachte Telefon als Objekt, Person als Thema. Angenommen, eine Person benutzt Telefon und B Person möchte auch das Telefon benutzen, aber als eine Person dh (Thread 1) ist es beschäftigt, es sei denn, die Arbeit erledigt eine Sperre auf Telefon Object jetzt B ie (Thread 2) versucht zu Benutze Telefon, aber wenn A eine Sperre erhalten hat, geht es in den Wartezustand, bis die Sperre aufgehoben wird.

  • Wenn das Telefonobjekt die Methode wait aufruft, wird der aktuelle Thread eingeschränkt die Telefon benutzen wollen und es wird in den Wartezustand gehen.
  • Wenn das Telefonobjekt anruft, signalisiert es dem wartenden Thread es zu sperren und mit der beabsichtigten Arbeit fortzufahren.
  • Wenn Person A (Thread 1) das Telefonobjekt verwendet und sich in einer Aufgabe befindet aber Interrupt-Methode wird aufgerufen, dann wird A signalisiert, mit zu stoppen aktuelle Aufgabe und muss möglicherweise eine andere Aufgabe zugewiesen werden.
karan shah 27.05.2015 12:54
quelle