Nel libro Thinking in Java è scritto che Thread.interrupt()
non può interrompere un thread che sta tentando di acquisire un blocco sincronizzato, voglio sapere perché?Perché Thread.interrupt() non può interrompere un thread che tenta di acquisire il blocco
risposta
Un'operazione di blocco può essere interrotta solo se viene dichiarato il lancio di InterruptedException
. Chiaramente, un blocco synchronized
non lo dichiara, quindi è impossibile interrompere un thread mentre è in attesa di acquisire un blocco.
In alternativa è possibile utilizzare un blocco esplicito e chiamare Lock.lockInterruptibly()
.
Il libro è errato, a meno che non si riferisca solo alla parola chiave synchronized
. Object.wait()
genera InterruptedException
.
Ho letto la versione cinese del libro, ci sono alcuni errori, ma penso che questo posto sia giusto. Questa potrebbe essere la mia espressione non è chiara causa il tuo equivoco – wanghao
@wanghao, se si desidera padroneggiare la concorrenza quindi consiglio vivamente "Concurrency Java in Practice (Brian Goetz)". – Ruslan
@wanhao 'Object.wait()' genera 'InterruptedException'. Non c'è niente da fraintendere. Se il libro non è d'accordo, è sbagliato, per definizione. Se si tratta solo della parola chiave 'sincronizzata', non lo hai detto. Se hai * un motivo * per pensare che il libro sia giusto e ho frainteso qualcosa, ti preghiamo di fornirlo. – EJP
- 1. Metodi che annullano il flag Thread.interrupt()
- 2. Thread.interrupt() in Java: qual è il punto?
- 3. Thread.Interrupt per interrompere il sonno lungo all'arresto dell'app - C'è un approccio migliore
- 4. Come interrompere/interrompere un boost :: thread?
- 5. Karma non può acquisire PhantomJS
- 6. Impossibile interrompere il thread se è effettivamente in elaborazione?
- 7. Perché il blocco Mail non può vedere la mia variabile?
- 8. Come interrompere un thread Java?
- 9. Cosa succede a un Thread che non riesce ad acquisire un Semaforo?
- 10. Come interrompere un thread dalla modifica di un array che viene utilizzato da un altro thread?
- 11. Perché C# non consente il blocco di un valore nullo?
- 12. Come acquisire un blocco tramite una chiave
- 13. Java Thread.stop() vs Thread.interrupt()
- 14. come interrompere un thread in un threadpool
- 15. Il thread chiamante non può accedere a questo oggetto perché un thread diverso lo possiede
- 16. Evita il blocco del thread principale quando UIWebView tenta di bloccare in modo bloccante il thread Web
- 17. Perché il codice in fine blocco non viene eseguito?
- 18. Come interrompere il blocco TcpListener :: accetta la chiamata?
- 19. Che cos'è il thread di interrupt?
- 20. Come interrompere il thread asynctask in Android?
- 21. Cosa può causare il blocco del pacchetto TCP/IP senza interrompere la connessione?
- 22. come interrompere il thread ASyncTask in Android
- 23. Come interrompere un thread java con garbo?
- 24. Come interrompere un altro thread in .NET, quando detto thread sta eseguendo Console.ReadLine?
- 25. Come avviare e interrompere il thread?
- 26. Quale thread otterrà il blocco?
- 27. Quando su alcuni thread viene chiamato Thread.interrupt(), cosa succede?
- 28. Perché il blocco catch di questo codice non viene eseguito?
- 29. log4net GenericFailure. Impossibile acquisire il blocco sul file
- 30. non è stato in grado di acquisire il blocco su un componente
Può interrompere la discussione. Il thread non smetterà di aspettare il blocco sincronizzato quando viene interrotto, ad esempio (lanciando un InterruptedException) se stava dormendo, per esempio. Ma se il thread ottiene il blocco, quindi controlla se è interrotto, lo sarà. –
In un programma ben progettato, nessun thread mantiene mai un blocco più a lungo di quanto occorra per esaminare e aggiornare alcune variabili. Non ci dovrebbe essere bisogno di un interrupt per "svegliare" un blocco "sincronizzato" in sospeso. Se pensi che io abbia torto, e il tuo programma ha davvero bisogno di quell'abilità, allora considera di usare 'java.util.concurrent.locks.ReentrantLock' invece di usare' synchronized'. Il metodo 'reentrantLock.tryLock (time, unit)' può essere interrotto. –