2015-08-15 14 views
5

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

+3

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à. –

+0

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. –

risposta

6

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().

1

Il libro è errato, a meno che non si riferisca solo alla parola chiave synchronized. Object.wait() genera InterruptedException.

+0

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

+0

@wanghao, se si desidera padroneggiare la concorrenza quindi consiglio vivamente "Concurrency Java in Practice (Brian Goetz)". – Ruslan

+0

@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

Problemi correlati