Java에서 교착 상태 스레드를 종료하는 방법은 무엇입니까?
-
13-09-2019 - |
문제
교착 상태에 빠진 스레드를 종료하고 싶습니다.첫째, 우리는 할 수 있습니다 교착상태 상태의 스레드 ID 감지 사용하여 findDeadlockedThreads()
의 방법 ThreadMXBean
수업 java.lang.management
.
그런 다음 스레드 ID로 스레드를 종료하고 싶습니다. 따라서 두 가지 관련 질문이 있습니다.
(1) 스레드 ID로 스레드 제어를 얻는 방법은 무엇입니까?
(2) 차단된 스레드를 죽이는 방법은 무엇입니까?Interrupt() 메서드를 호출하면 스레드에 예외가 발생하고 스레드가 종료될 것이라고 생각합니다.
해결책
루트 스레드 그룹에서 Thread 클래스를 가질 수 있습니다. 실행 중인 모든 스레드를 열거합니다..그런 다음 귀하의 ID와 일치하는 Thread.stop을 호출할 수 있습니다.
그렇긴 하지만, 이는 개체를 일관성 없는 상태로 둘 가능성이 있기 때문에 매우 위험합니다.나는 인터럽트 방법이 동기화 잠금을 기다리는 동안 멈춰 있는 스레드를 해제할 것이라고 믿지 않습니다. 따라서 (사악한) 중지 방법은
또한보십시오:"Java 스레드 기본 지원 중단".
다른 팁
java.util.concurrent.Lock.lockInterruptible() 메소드는 인터럽트 가능하지만 훨씬 더 일반적인 동기화 잠금은 인터럽트 가능하지 않습니다.설명서에서 언급한 대로 교착 상태 스레드를 열거하는 기능은 디버깅을 돕기 위한 것이며 프로덕션 환경에서 복구하기 위한 수단은 아닙니다.
프로덕션에서는 전체 프로세스를 종료하고 다시 시작하는 것이 더 안전할 수 있습니다.
Thread.stop()도 내장 잠금에서 교착 상태에 빠진 스레드를 중지할 수 없습니다.스레드가 고유 잠금을 기다리면서 차단된 경우 스레드가 결국 잠금을 획득하고 다른 방법으로 주의를 끌 수 있을 만큼 충분한 진행을 하는지 확인하는 것 외에는 스레드를 중지할 수 있는 방법이 없습니다. Lock.lock()을 통해 작동합니다.