2010-03-14 3 views

답변

0

동기화 대상을 기다리고있는 메서드는 죽지 않아야합니다. 그러나 잘못되었을 때 ("영원히"와 같이) 오랜 시간 기다릴 수 있습니다. 아마도 귀하의 프로그램은 결코 자원에 대한 잠금을 해제하지 않습니다?

+0

감사합니다. 교착 상태가 있다고 생각하지 않습니다. 그러나 그 원인이 될 수 있습니다 .. – MalcomTucker

4

JLSsynchronized 섹션에 시간 제한을 지정하지 않습니다. 실행중인 스레드가 잠금을 소유하고 있지만 그것은 단지

를 언급, 다른 스레드는 잠금을 획득하지 않을 수 있습니다.

4

join() 메소드에서 시간 초과를 설정하여 영원히 기다리지 않도록 할 수 있습니다.

필자는 java.util.concurrent 패키지를보고 자신의 상황에 도움이되는 새로운 기능이 추가되었는지 확인하려고합니다.

Brian Goetz의 "Java Concurrency In Practice"도 좋습니다. (다시 직접 읽어야합니다.)

+1

좋은 점 : 두 번째 스레드가 서로를 기다리고 있음을 의미하는 "교착 상태"라는 의미입니다. 타임 아웃이 발생하면 "교착 상태"라는 용어는 존재하지 않습니다. – Pindatjuh

+0

duffymo - 하나의 스레드가 다른 스레드를 시작하고 두 번째 스레드가 첫 번째 스레드로 진행 상황을보고해야하지만 두 번째 스레드가 완료되기 전에 첫 번째 스레드가 종료되면 어떤 일이 발생할 것으로 예상됩니까? – MalcomTucker

+0

잘 모르겠습니다. 그것은 양방향 통신이되어야하는 것처럼 들리지만 그렇지 않습니다. 여기서 콜백이 필요합니다. 그래서 원시 java.lang.Thread를 넘어서 java.util.concurrent 패키지를 살펴 보는 것이 좋습니다. 새로운 기능이 적용될 수 있기 때문입니다. – duffymo

0

자바 스레드는 갑자기 죽지 않습니다. 진행 중이 아니거나 (잠금 또는 무한 루프 또는 이와 유사한 방식으로 차단됨) 예외가 발생하고 처리되지 않으면 예외가 최상위 수준으로 전파 될 때 스레드의 실행이 중지됩니다. 예외가 발생하면 예외를 인쇄해야합니다 System.err에 대한 스택 추적).

응용 프로그램이 교착 상태에있는 경우 이유를 찾는 한 가지 방법은 스레드 덤프를 만드는 것입니다. JVM은 단순한 교착 상태를 감지 할 수도 있는데,이 경우 스레드 덤프에이를보고합니다.

kill -QUIT <pid>을 실행하고 Windows에서 콘솔 창에 Ctrl + Break을 입력하여 Linux에서 스레드 덤프를 생성 할 수 있습니다. 또는 더 단순한 경우 VisualVM, StackTrace 또는 이와 유사한 도구를 사용하십시오.

0

kill -3을 사용하여 스레드 덤프를 확인한 다음 문제가있는 스레드가 무엇인지 확인하는 것이 좋습니다.

관련 문제