Java マルチスレッド プログラムでは、すべてのスレッドがキャッチされなかったチェック例外をスローすることを許可されていないため、各スレッドが独自のチェック例外を処理する必要があります。これは、java.lang.Runnable.run() メソッド宣言によって制約されます (このメソッド宣言にはスロー例外部分がないため)。ただし、スレッドは依然としてチェックされていない例外をスローする可能性があり、そのような例外がスローされた場合、スレッドは終了し、メインスレッドおよび他のスレッドはまったく影響を受けず、特定のスレッドによってスローされた例外は認識されません。 all (また、この例外はまったくキャッチできないとも言われます)。 JVM のこの設計は、「スレッドは独立して実行されるコードの断片である。スレッドの問題は外部に委任するのではなく、スレッド自体によって解決されるべきである。」という概念に基づいて、Java ではスレッドのメソッド例外 (チェックされているかどうかに関係なく) が発生します。または未チェックの例外など)は、スレッド コード境界内(run メソッド内)でキャッチして処理する必要があります。
しかし、スレッドがそれ自体でチェックされていない例外をキャッチしようとせず、この例外をスレッド コード境界の外側 (run メソッドの外側) でキャッチして処理したい場合、Java は例外が発生したときに例外をキャッチする方法を提供します。スレッド内でスレッド コード境界の外側で例外を処理するためのコールバック メカニズムは、Thread オブジェクトによって提供される setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) メソッドです。
このメソッドを通じてスレッドの UncaughtExceptionHandler を設定すると、スレッドで例外が発生したときに、UncaughtExceptionHandler インターフェイスの public void uncaughtException(Thread t, Throwable e) メソッドをコールバックして例外を処理できるようになります。これの目的は、スレッド内で使用できるようにすることです。コード境界の外側 (スレッドの run() メソッドの外側) には、キャッチされなかった例外を処理する場所があります。ただし、特に明確にしておく必要があるのは、例外はコールバック メソッドで処理されますが、コールバック メソッドは、実行時に例外をスローしたスレッド内にまだ存在するということです。
上記の方法と比較して、参考にできる別のプログラミング方法があります。つまり、メインスレッドの呼び出し元は、サブスレッドの実行中にどのような例外が発生したかを知りたいだけの場合がありますが、必ずしもそうとは限りません。子スレッドを開始するメソッドは、子スレッドによってスローされた例外インスタンスを収集し、例外のリストとして呼び出し元に返すことができ、呼び出し元は異常な状況に応じて対応方法を決定できます。 。ただし、この時点では子スレッドがすでに終了していることに注意することが重要です。