Come uccidere le discussioni deadlock in Java?
-
13-09-2019 - |
Domanda
Mi piacerebbe uccidere le discussioni che sono bloccati in stato di stallo. In primo luogo, possiamo rilevare ids discussione in stato di deadlock utilizzando il metodo findDeadlockedThreads()
della classe ThreadMXBean
in java.lang.management
.
Poi, mi piacerebbe uccidere i filetti di ids filo, e quindi ho due questioni correlate:
(1) Come ottenere il controllo di un filo per filo id?
(2) Come uccidere un filo bloccato? Penso che invokting interrupt () metodo darà un'eccezione per il filo e ucciderà il filo.
Soluzione
Dal ThreadGroup radice, si può avere la classe enumerare tutti i thread in esecuzione . Poi si può chiamare Thread.stop su quello che corrisponde al proprio ID.
Detto questo, questo è altamente pericoloso a causa del potenziale di lasciare oggetti in uno stato incoerente. Non credo che il metodo interrupt causerà un thread essere liberato che è bloccato in attesa di un blocco di sincronizzazione, quindi la (male) fermata metodi
Vedere anche: " Java Discussione Primitive Deprecation ".
Altri suggerimenti
Il metodo java.util.concurrent.Lock.lockInterruptibly () è interrompibile, il bloccaggio sincronizzato molto più comune non è. Come menzionato nella documentazione, la capacità di enumerare discussioni deadlock è inteso come un aiuto di debug e non come un mezzo per recuperare in un ambiente di produzione.
Nella produzione si è probabilmente più sicuro per uscire l'intero processo e di riavvio.
Anche Thread.stop () è in grado di fermare filo deadlock delle serratura intrinseca. Se un thread è bloccato in attesa di un blocco intrinseco, non c'è niente che tu possa fare per fermarlo corto di assicurare che alla fine acquisisce il blocco e fa progressi sufficienti che si può ottenere la sua attenzione in qualche altro modo. funziona con blocco .lock () attraverso.