Java 다중 스레드 프로그램에서는 모든 스레드가 포착되지 않은 확인된 예외를 발생시키는 것이 허용되지 않습니다. 이는 각 스레드가 자체 확인된 예외를 처리해야 함을 의미합니다. 이는 java.lang.Runnable.run() 메소드 선언에 의해 제한됩니다(이 메소드 선언에는 예외 발생 부분이 없기 때문입니다). 그러나 스레드는 여전히 확인되지 않은 예외를 throw할 수 있습니다. 이러한 예외가 발생하면 스레드가 종료되고 기본 스레드와 다른 스레드는 전혀 영향을 받지 않으며 특정 스레드에서 발생한 예외가 인식되지 않습니다. all (또한 이 예외는 전혀 잡을 수 없다고 합니다). JVM의 이러한 설계는 "스레드는 독립적으로 실행되는 코드 조각입니다. 스레드 문제는 외부에 위임하기보다는 스레드 자체에 의해 해결되어야 합니다."라는 개념에서 유래합니다. 또는 확인되지 않은 예외)는 스레드 코드 경계 내(run 메소드 내)에서 포착되어 처리되어야 합니다.
그러나 스레드가 검사되지 않은 예외를 자체적으로 포착하려고 시도하지 않고 스레드 코드 경계 외부(run 메소드 외부)에서 이 예외를 포착하고 처리하려는 경우 Java는 예외가 발생할 때 예외를 포착할 수 있는 방법을 제공합니다. 스레드 내에서 스레드 코드 경계 외부의 예외를 처리하기 위한 콜백 메커니즘은 Thread 개체에서 제공하는 setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 메서드입니다.
이 메서드를 통해 스레드에 대해 UncaughtExceptionHandler를 설정하면 스레드에서 예외가 발생할 때 UncaughtExceptionHandler 인터페이스의 public void uncaughtException(Thread t, Throwable e) 메서드를 다시 호출하여 예외를 처리할 수 있다는 것을 확인할 수 있습니다. 또는 이것의 목적은 스레드에서 사용할 수 있다는 것입니다. 코드 경계 외부(Thread의 run() 메소드 외부)에는 포착되지 않은 예외를 처리할 수 있는 장소가 있습니다. 하지만 특히 분명한 점은 예외가 콜백 메서드에서 처리되더라도 콜백 메서드가 실행될 때 예외를 던진 스레드에 여전히 있다는 것입니다!
위의 방법과 비교하여 참고로 사용할 수 있는 또 다른 프로그래밍 방법이 있습니다. 즉, 때로는 메인 스레드의 호출자가 하위 스레드 실행 중에 어떤 예외가 발생했는지 알고 싶을 수도 있지만 반드시 그런 것은 아닙니다. 그런 다음 자식 스레드를 시작하는 메서드는 자식 스레드에서 발생한 예외 인스턴스를 수집하여 예외 목록으로 호출자에게 반환할 수 있으며 호출자는 비정상적인 상황에 따라 어떻게 대응할지 결정할 수 있습니다. . 그러나 이 시점에서 하위 스레드가 이미 종료되었다는 점에 유의하는 것이 중요합니다.