2009-08-04 6 views
21

Java에서 스레드를 만든 사람을 어떻게 알 수 있습니까?스레드 작성자 검색 (이클립스 사용)

다음을 상상해보십시오. ~ 30 타사 복잡한 플러그인 환경의 JAR을 사용합니다. 시작하고, 많은 코드를 실행하고, 계산을하고, 마지막으로 shutdown()을 호출합니다.

이 수명주기는 대개 정상적으로 작동하지만 일부 실행시 (비 데믹) 스레드는 매달려 있습니다. 모든 셧다운이 마지막 셧다운 인 경우 문제가되지 않을 것입니다.이 경우 System.exit()을 간단히 실행할 수 있습니다. 그러나이 사이클은 여러 번 실행될 수 있으며 매 회마다 더 많은 쓰레기를 생성합니다.

그럼 어떻게해야합니까? Eclipse의 디버그 뷰에 스레드가 표시됩니다. 나는 그들의 스택 트레이스를 본다.하지만 그것들의 기원에 대한 힌트는 없다. 작성자의 스택 추적이 없으며 구분 가능한 클래스 이름이 없습니다.

누구든지이 문제를 해결하는 방법을 알고 있습니까?

+0

당신은 상속받은 acc 필드에서 코드 소스를 볼 수 있어야한다고 생각합니다. –

+0

http://stackoverflow.com/questions/9874641/tracking-java-thread-creation-and-lifetime에 관련됨 –

답변

10

나는 내 스레드의 이름을 (예 : Thread(Runnable, String)을 사용하여) 종교적으로 지정합니다. 그렇지 않으면 일반적이고 다소 쓸데없는 이름으로 끝납니다. 스레드를 덤프하면 실행중인 항목과 작성된 항목이 강조 표시됩니다. 이것은 써드 파티 쓰레드 생성을 해결하지 못한다.

편집 : JavaSpecialist 뉴스 레터는 보안 관리자를 사용하여 최근 (2015 년 2 월)이 문제를 해결했습니다. here for more details

자세히 : JavaSpecialist 기술 사용에 대한 몇 가지 세부 정보 : SecurityManager API에는 스레드 작성자의 스레드에서 호출되는 "checkAccess (newThreadBeingCreated)"가 포함됩니다. 새 스레드는 이미 초기화 된 "이름"을가집니다. 그래서 그 방법에서는 스레드 작성자의 스레드와 새 스레드 모두에 액세스 할 수 있으며 로그/인쇄 등을 수행 할 수 있습니다.이 코드를 사용하면 모니터링중인 코드가 액세스 보호 예외를 throw하기 시작했습니다. run() 메서드가 모니터링되는 코드를 호출 한 AccessController.doPriviledged (new PrivilegedAction() {...})로 수정하여 수정했습니다.

0

이클립스에서는 모든 블로킹을 볼 수 있습니다. 스레드의 스택 추적은 내부 상태를 반영하고 (분명히) 자신의 생성 위치에 대한 정보를 공개하지 않습니다. 또한 (변수보기를 사용하여) 객체 내부를 보았을 때 더 이상의 힌트를 이끌어 낼 수 없었습니다.

+0

"불행히도" "그게"이 아니라 무엇을하지 않습니까? –

+0

"제 3 자 스레드 생성 문제 해결" – EoH

+0

@EoH, 당신이 코멘트하고 싶다고 대답했지만 대신 답을 보냈다고 가정합니다. 답변을 삭제하고 의견을 말하십시오. (나는 이것이 아직 어떻게 뉘어지지 않았는지 모르겠다.))))) – superM

1

Eclipse 애플리케이션을 디버깅 할 때 디버그보기에서 org.eclipse.equinox.launcher.Main 필드를 클릭하여 모든 스레드를 중지 할 수 있습니다.

그런 다음 각 스레드에 대해 스택 추적을보고 thred run 메소드로 이동합니다.

가끔은 도움이되거나 때로는 그렇지 않을 수도 있습니다. 브라이언은 쉽게 "을 만든 사람"식별 할 수있는 유일한 방법이기 때문에, 그것은 좋은 방법이 스레드의 이름을 말했듯이

+1

내가 이미 언급했듯이 나는이 경우에 도움이되지 않는다. 그리고 저는 반복합니다. * 나는 이러한 스레드를 만들지 않았습니다. – EoH

+0

내가 말했듯이, 그 이름이 그 유일한 해결책이라고 생각합니다. 이 스레드의 "작성자"는이 이름을 지정하지 않았으므로 언급 한 솔루션 (Thread.start() 디버깅) 만이 유일한 솔루션이라고 생각합니다. –

13

좋아, 난 내 자신의 문제 (종류의) 해결할 수 있었다 : I 중단 점을 넣으십시오.

Thread.start() 

각 호출을 수동으로 수행하십시오. 이 방법을 사용하면 매우 빨리 알 수 있습니다. Class.forName()이 정적 인 코드를 초기화하여이 신비한 스레드를 생성했습니다.

나는 내 문제를 해결할 수 있었지만 나는 더 일반적인 작업이 아직 해결되지 않은 채로 남아 있다고 생각한다.