2013-11-23 3 views
0

응용 프로그램의 폴러 스레드 중 하나가 돌아 오지 않는 경쟁 조건을 디버깅하려고 시도하면 향후 폴러가 예약되지 않을 수 있습니다. 추상적 인 관점에서 문제를 포착하면서 비즈니스 로직을 숨기려면 여기에 코드 경로가 있습니다.ThreadPoolExecutor가 응답하지 않음

원격 서버에서 리소스 Y의 일부 상태 X를 업데이트해야합니다. 우리는 리소스 상태를 변경하고 변경의 부작용으로 X를 업데이트하는 리소스 관리자를 가지고 있습니다. 이 관리자는 리소스를 지속적으로 폴링하고 리소스가 업데이트되었다고 생각하면 ThreadPoolExecutor을 사용하여 작업을 수행합니다. 이 스레드 풀 실행 프로그램은 적당한 크기의 블로킹 큐를 가지고 있지만 상당히 적은 수의 최대 스레드를 가지고 있습니다. 스레드 덤프의 중단 자체는 invokeAll 호출에서 발생합니다. (다른 것들 중에서도)

이 풀 실행자의 코어 /).

invokeAll은 우리가 기다리는 미래를 반환하기 때문에 executor가 사용하는 블로킹 데이터 구조가 invokeAll을 통해 전달 된 작업을 수용 할만큼 충분히 크지 만 사용 가능한 스레드가 충분하지 않더라도 invokeAll이 중지됩니까? 다른 사용자가 몇 가지 코드 (심지어 의사 코드), 그리고 "상태가 X"무엇을 명확하게 이해하고, 무엇을 "자원 Y"없이 지적했듯이

+0

일부 코드를 게시하십시오. – raffian

답변

3

, 그것은 사실상 불가능하다 지적인 응답을 제공하는 여기있는 사람. 즉, SSCCE이 필요합니다. 그럼에도 불구하고 여기에서 최선을 다할 것입니다. 게시물 코드를 작성하고/또는 추가 정보를 제공하면 그에 따라 답변을 업데이트하겠습니다. Java 7 ExecutorService#invokeAll javadoc에서

:

모두 완전한 상태를 유지 선물 및 결과의리스트를 돌려, 지정된 태스크를 실행합니다. Future.isDone()은 반환 된 목록의 각 요소에 대해 true입니다. 완료된 작업은 정상적으로 종료되거나 예외가 발생하여 종료 될 수 있습니다. 이 조작의 실행 중에 지정된 콜렉션이 변경되었을 경우,이 메소드의 결과는 보증되지 않습니다. 당신의 설명에서

(그리고 다시, 나는 때문에 세부 사항의 부족 확실히 말할 수 없다), 당신의 작업자 스레드 중 하나가 걸려있다. invokeAll(...)을 호출하기 때문에, 실행 스레드는 매달린 쓰레드가 끝나기를 기다리고 있기 때문에 걸려있다. 하지만 절대로 그렇지 않습니다. 이제 왜 쓰레드가 끊어 졌는지에 관해서는 완전히 다른 문제이며, 우리는 분명히 약간의 코드를보아야 할 것입니다. HTH.