ホームページ >Java >&#&チュートリアル >Java で子スレッドからスローされた例外を処理するにはどうすればよいですか?

Java で子スレッドからスローされた例外を処理するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-05 16:37:19827ブラウズ

How Can I Handle Exceptions Thrown from Child Threads in Java?

スレッドからスローされた例外の処理

マルチスレッド アプリケーションでは、メイン スレッドの子スレッドによってスローされた例外を処理することが不可欠です。次のシナリオを考えてみましょう。

<br>public class Test extends Thread {<br> public static void main(String[] args) throws InterruptedException {</p>
<pre class="brush:php;toolbar:false">Test t = new Test();

try {
  t.start();
  t.join();
} catch (RuntimeException e) {
  System.out.println("** RuntimeException from main");
}

System.out.println("Main stoped");

}

@Override
public void run() {

try {
  while (true) {
    System.out.println("** Started");

    sleep(2000);

    throw new RuntimeException("exception from thread");
  }
} catch (RuntimeException e) {
  System.out.println("** RuntimeException from thread");

  throw e;
} catch (InterruptedException e) {

}

}
}

この例では、子スレッドでスローされた例外はメイン スレッドに伝播しません。これは、Java がスレッドでスローされた例外をメイン スレッドのハンドラーに自動的に関連付けないためです。

解決策: Thread.UncaughtExceptionHandler

スレッドからの例外を処理するには、 Thread.UncaughtExceptionHandler を使用できます。このインターフェイスは、スレッドでキャッチされない例外が発生したときに呼び出されるメソッド uncaughtException() を提供します。

Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler() {
  @Override
  public void uncaughtException(Thread th, Throwable ex) {
    System.out.println("Uncaught exception: " + ex);
  }
};
Thread t = new Thread() {
  @Override
  public void run() {
    System.out.println("Sleeping ...");
    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      System.out.println("Interrupted.");
    }
    System.out.println("Throwing exception ...");
    throw new RuntimeException();
  }
};
t.setUncaughtExceptionHandler(h);
t.start();

スレッドに uncaughtExceptionHandler を設定することにより、キャッチされない例外は提供された実装によって処理されます。これにより、メインスレッドが例外を適切にキャプチャして処理できるようになり、適切な処理とエラー報告が保証されます。

以上がJava で子スレッドからスローされた例外を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。