In dem Buch Denken in Java wird geschrieben, dass Thread.interrupt()
einen Thread nicht unterbrechen kann, der versucht, eine synchronisierte Sperre zu erwerben, möchte ich wissen, warum?Warum kann Thread.interrupt() einen Thread nicht unterbrechen, der versucht, Sperre anzunehmen
Antwort
Ein Blockiervorgang kann nur unterbrochen werden, wenn InterruptedException
ausgelöst wird. Ein synchronized
Block deklariert dies natürlich nicht, daher ist es unmöglich, einen Thread zu unterbrechen, während er darauf wartet, eine Sperre zu erhalten. Alternativ können Sie eine explizite Sperre verwenden und Lock.lockInterruptibly()
anrufen.
Das Buch ist falsch, es sei denn, es bezieht sich nur auf das Schlüsselwort synchronized
. Object.wait()
wirft InterruptedException
.
Ich lese die chinesische Version des Buches, es gibt ein paar Fehler, aber ich denke, dieser Ort ist richtig. Dies kann sein Ausdruck ist nicht klar, weil Ihr Missverständnis – wanghao
@ Wanghao, wenn Sie Nebenläufigkeit dann würde ich stark empfehlen "Java Concurrency in der Praxis (Brian Goetz)". – Ruslan
@wanhao 'Object.wait()' wirft 'InterruptedException'. Da gibt es nichts zu missverstehen. Wenn das Buch nicht übereinstimmt, ist es per Definition falsch. Wenn es nur um das synchronisierte Keyword geht, haben Sie das nicht gesagt. Wenn Sie einen Grund haben zu glauben, dass das Buch richtig ist und ich etwas falsch verstanden habe, geben Sie es bitte an. – EJP
- 1. Unterbrechen Sie einen Thread in DatagramSocket.receive
- 2. Python-Threading. Wie sperre ich einen Thread?
- 3. Wert basierte Thread-Sperre
- 4. Fehlerbehebung: Warum kann ich keine Sperre erhalten?
- 5. Thread-Sperre in Python
- 6. Java Thread.stop() vs Thread.interrupt()
- 7. Thread.interrupt() in Java: Was ist der Sinn?
- 8. Warum kann ich keine exklusive Sperre erwerben?
- 9. Warum stoppt der Thread nicht?
- 10. Warum kann ich eine if-Anweisung nicht unterbrechen?
- 11. Wie wiederholbare Unit-Tests von Code, der mit Thread.interrupt funktioniert?
- 12. Warum versucht mein Pufferüberlauf einen Segfaulting?
- 13. Warum versucht der allgemeine ForkJoinPool nicht, alle Kerne zu verwenden?
- 14. Kann APC WSAWaitForMultipleEvents unterbrechen?
- 15. Java: Warum läuft der Haupt-Thread nicht?
- 16. Java lange laufende Aufgabe Thema unterbrechen vs Abbrechen Flagge
- 17. Warum ist Interlocked langsamer als Sperre?
- 18. können Sie einen Indy-Connect-Anruf unterbrechen?
- 19. Einen einfachen GNUradio-Fluss unterbrechen
- 20. Ströme ignorieren/unterbrechen/unterbrechen in Funktionsreaktive Programmierung?
- 21. Verwenden der Sperre mit Threading.Timer
- 22. Kann glGetError einen Thread blockieren?
- 23. Gibt es irgendwelche Vorteile, einen Thread zu unterbrechen, um ihn warten zu lassen?
- 24. Wer unterbricht meinen Thread?
- 25. Schwierigkeiten zu verstehen, das Verhalten des thread.interrupt() -Methode
- 26. Warum implementiert Thread IDisposable nicht?
- 27. flock (1) kann die Sperre nicht aufheben
- 28. Versucht zu wissen, warum der OpenMP-Code nicht parallelisiert
- 29. Löscht ein Thread eine Sperre, wenn es fertig ist?
- 30. Python: Wie raw_input() in anderen Thread zu unterbrechen
Es kann den Thread unterbrechen. Der Thread hört einfach nicht auf, auf die synchronisierte Sperre zu warten, wenn sie unterbrochen wird, wie beispielsweise (wenn eine InterruptedException ausgelöst wird), wenn sie beispielsweise schläft. Aber wenn der Thread die Sperre erhält, dann prüfe, ob es unterbrochen ist, wird es sein. –
In einem gut entworfenen Programm würde kein Thread jemals eine Sperre länger halten, als es dauert, um einige Variablen zu untersuchen und zu aktualisieren. Es sollte kein Interrupt erforderlich sein, um einen ausstehenden "synchronisierten" Block aufzuwecken. Wenn Sie denken, dass ich falsch liege und Ihr Programm diese Fähigkeit wirklich benötigt, dann sollten Sie 'java.util.concurrent.locks.ReentrantLock' verwenden, anstatt' synchronized' zu verwenden. Die Methode 'reentrantLock.tryLock (time, unit)' _kann unterbrochen werden. –