"안녕, 아미고!

"사소하지만 흥미로운 것에 대해 이야기하고 싶습니다."

"듣고 있어요. 작고 재미있는 걸 좋아해요."

"음, 모든 스레드 개체에는 run() 메서드가 있다는 것을 알고 있습니다. 그리고 start() 메서드를 사용하여 별도의 스레드에서 실행할 수 있습니다."

"물론이죠."

"하지만 이제 다음 상황을 상상해 보십시오. 어떤 작업을 수행하기 위해 스레드를 시작했지만 예외가 발생하고 스레드는 무엇을 해야 할지 모르기 때문에 실행을 중지합니다. 어떻게든 이 오류에 대해 알아야 하지 않습니까?"

"동의합니다. 실행 중인 다른 스레드에서 발생한 예외를 어떻게든 잡아내야 합니다. Java가 이를 지원합니까?"

"당신은 나를 모욕합니다. 물론 그렇습니다."

"Java의 제작자는 UncaughtExceptionHandler라는 특수 인터페이스를 발명했습니다. 다음은 다른 스레드에서 발생하는 예외를 포착하고 처리하는 방법입니다. 해당 스레드가 예외를 포착하지 못하는 경우:"

public class DownloadManager
{
 public static void main(String[] args)
 {
   Thread thread = new DownloadThread();
   thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
   {
    @Override
    public void uncaughtException(Thread t, Throwable e)
    {

    }
 });

 thread.start();
}

"Thread 개체에는 특별한 setUncaughtExceptionHandler 메서드가 있습니다. Thread.UncaughtExceptionHandler 인터페이스 를 구현하는 개체를 전달해야 합니다 . 이 인터페이스 에는 uncaughtException(Thread t, Throwable e) 메서드가 하나만 있습니다 . 이 메서드는 다음에 호출됩니다. run 메서드에서 포착되지 않은 예외가 발생하면 전달된 개체입니다."

"위의 예에서는 Thread.Thread.UncaughtExceptionHandler 인터페이스 를 구현하는 익명의 내부 클래스(빨간색으로 강조 표시됨)를 선언하고 uncaughtException(Thread t, Throwable e) 메서드를 재정의합니다 ."

"메서드의 매개변수 목록에서 볼 수 있듯이 예외가 발생한 스레드 개체에 대한 참조와 Throwable e로 전달된 예외 자체의 두 가지 인수가 전달됩니다."

"음, Thread 변수 t가 필요한 이유는 무엇입니까? Thread.UncaughtExceptionHandler 객체를 어떤 스레드에 넣을지 이미 알고 있지 않습니까?"

"그들은 이러한 상황에 대한 범용 핸들러를 작성할 수 있도록 이렇게 했습니다. 즉, 단일 개체를 생성하고 수십 개의 다른 스레드에 전달할 수 있습니다. 그러면 uncaughtException( Thread t, Throwable e) 메서드는 항상 예외가 발생한 스레드 개체입니다."

"또한 예를 들어 특정 작업을 수행하기 위해 루프에서 수십 개의 스레드를 만들 수 있습니다. 일반적으로 스레드 개체에 대한 이 참조는 불필요하지 않습니다. 약속합니다."

"나는 당신을 믿습니다. 당신은 결코 틀린 적이 없습니다."