2009-12-04 8 views
8

Mi piacerebbe uccidere i thread bloccati in stato di deadlock. Innanzitutto, possiamo detect thread ids in deadlock state utilizzando il metodo findDeadlockedThreads() della classe ThreadMXBean in java.lang.management.Come uccidere thread con deadlock in Java?

Quindi, mi piacerebbe terminare i thread per id di thread e quindi ho due domande correlate:
(1) Come ottenere il controllo di una discussione tramite ID thread?
(2) Come uccidere un thread bloccato? Penso che invocare il metodo interrupt() darà un'eccezione al thread e ucciderà il thread.

+3

La correzione del codice in modo che i thread non si bloccassero in primo luogo dovrebbe essere ciò che si sta tentando di fare. – Chris

+0

Come ha detto Chris, penso che dovresti escogitare un piano per evitare i deadlock in primo luogo. – Alfred

+1

L'unico modo ragionevolmente sicuro di fare ciò che vuoi è System.exit() ... e sto scherzando solo in parte. – PSpeed

risposta

3

Dal threadgroup principale, è possibile avere la classe Thread enumerate all running threads. Quindi puoi chiamare Thread.stop su quello che corrisponde al tuo ID.

Detto questo, questo è estremamente pericoloso a causa della possibilità di lasciare oggetti in uno stato incoerente. Non credo che il metodo di interruzione causerà la liberazione di un thread bloccato nell'attesa su un blocco di sincronizzazione, quindi i metodi di arresto (diabolico)

Vedere anche: "Java Thread Primitive Deprecation".

+3

La cattiveria di questo non può essere enfatizzata abbastanza. Meglio scrivere il codice per evitare il deadlock in primo luogo. – bmargulies

+0

L'enumerazione di tutti i thread in esecuzione è un articolo interessante, quindi lo userò sicuramente in seguito. Grazie. – Sangmin

+1

L'approccio Thread.stop() non sembra funzionare in Java 1.5. I thread deadlock rimangono nello stato BLOCKED. Per quanto mi riguarda, sto cercando di scrivere un test unitario per un rilevatore di deadlock e non riesco a liberarmi dei miei thread intenzionalmente bloccati! :-) –

6

Il metodo java.util.concurrent.Lock.lockInterruptibly() è interrompibile, il blocco sincronizzato molto più comune non lo è. Come accennato nella documentazione, la capacità di enumerare i thread deadlock è intesa come un aiuto per il debug e non come un mezzo per recuperare in un ambiente di produzione.

In produzione è probabilmente più sicuro uscire dall'intero processo e riavviare.

+1

+1 per la frase finale –