2009-11-30 9 views
4

Java에서 클래스 A의 기본 메소드에서 스레드 T를 시작하고 T에서 예외가 발생하면 A의 기본 메소드에서 어떻게 알 수 있습니까? 잘못된 것이 아니라면 클래스 A의 인스턴스와 스레드 T가 두 개의 별도 스택에 존재하게됩니다. 그렇다면 스레드의 부모는 예외에 대해 어떻게 알 수 있습니까?Java : 자식 스레드에서 예외가 발생했습니다.

+0

질문 [여기] (http://stackoverflow.com/questions/1369204/how- to-throw-a-checked-exception-from-a-java-thread/1369828)가 직접적인 대답은 아니지만 흥미로울 수 있습니다. – Grundlefleck

답변

6

짧은 대답, 그렇지 않습니다. 예외가 스레드에서 모든 방향으로 전파되면 간단히 죽을 것입니다 (콘솔에 오류 인쇄가 발생할 수 있음).

그래도 관심이가는 부분은 가장 바깥 쪽의 스택 프레임 (즉, 스레드를 시작한 run-method)의 모든 예외를 잡아내는 것입니다. 대기열 또는 다른 통신 메커니즘에 예외를 넣을 수 있습니다 스레드가 종료되기 전에 스레드 ID와 같은 일부 메타 데이터). 그런 다음 대기열은 정기적으로 상위 스레드에 의해 쿼리됩니다 (또는 대기/알림 또는 조건 개체와 같은 상위 스레드를 깨우기 위해 다른 알림 메커니즘을 사용합니다).

+0

안녕하세요, thnx ..이 도움이 .. – user221327

4

try/catch 블록으로 스레드 코드를 둘러싸고 앞의 설명에서 이미 설명한대로 부모 스레드에 알리는 대신 UncaughtExceptionHandler을 무시할 수 있습니다. 이 메커니즘에 대해서는 here에 자세히 설명되어 있습니다. Java 설명서에서 Interface Thread.UncaughtExceptionHandler을 볼 수도 있습니다.

부모 스레드를 알리는 메커니즘이 스레드 코드에서 분리되어 다른 스레드에 재사용 될 수 있기 때문에 try/catch 블록보다 약간 좋은 방법이라고 생각합니다.

0

아무도 명시 적으로 스레드에 알리지 않으면 알 수 없습니다. 어쩌면 UncaughtExceptionHandler은 잡히지 않은 예외를 잡는 데 도움이 될 수 있습니다. 추가로 메인 스레드에 알리는 방법이 필요합니다.
이것은 interrupt()를 호출하거나 파이프, notify()/condition.await() 등을 사용하여 수행 할 수 있습니다.

관련 문제