「こんにちは、アミーゴ!

「小さいけど面白いことについてお話したいと思います。」

「聞いています。小さくて面白いものが大好きです。」

「すべての Thread オブジェクトには 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インターフェイスを実装するオブジェクトをそれに渡す必要があります。このインターフェイスにはメソッドが 1 つだけあります: uncaughtException(Thread t, Throwable e)。これが呼び出されるメソッドですrun メソッドでキャッチされない例外が発生した場合に渡されたオブジェクト。」

「上記の例では、 Thread.Thread.UncaughtExceptionHandlerインターフェイスを実装する匿名内部クラス (赤で強調表示) を単に宣言しています。そして、そのuncaughtException(Thread t, Throwable e)メソッドをオーバーライドします。」

「メソッドのパラメーター リストからわかるように、2 つの引数が渡されます。例外が発生した Thread オブジェクトへの参照と、Throwable e として渡される例外自体です。」

「それでは、なぜ Thread 変数 t が必要なのでしょうか? Thread.UncaughtExceptionHandlerオブジェクトをどの Thread に配置するかはすでにわかっているのではないでしょうか?」

「彼らは、これらの状況に対応する汎用ハンドラーを作成できるようにするためにこれを行いました。つまり、単一のオブジェクトを作成して、それを数十の異なるスレッドに渡すことができます。その後、uncaughtException( Thread t, Throwable e)メソッドは常に、例外が発生したスレッド オブジェクト。」

「さらに、たとえばループ内に数十のスレッドを作成して、特定のタスクを実行することもできます。一般に、Thread オブジェクトへのこの参照は不必要なものではありません。それは約束します。」

「私はあなたを信じています。あなたは決して間違っていません。」