スレッド上でrun()メソッドを呼び出し、run()メソッドがキャッチされなかった例外をスローすると、結果はどうなりますか?スレッドが例外をスローするとどうなりますか?
誰がこの例外をキャッチしますか?捕まえられるの?
スレッド上でrun()メソッドを呼び出し、run()メソッドがキャッチされなかった例外をスローすると、結果はどうなりますか?スレッドが例外をスローするとどうなりますか?
誰がこの例外をキャッチしますか?捕まえられるの?
ThreadGroup用に例外ハンドラがインストールされている場合、JVMはそれに例外を渡します。それがAWTスレッドの場合は、未処理の例外以外のイベントハンドラをインストールすることができます。それ以外の場合はJVMが処理します。
カスタムハンドラとスレッドグループの例と、それを使用する方法:あなたがにRunnableを提出した場合
public class MyExceptionHandler {
public void handle(Throwable ex) {
// Handle exception
}
public void handle(Thread t, Throwable ex) {
// Handle exception
}
}
System.setProperty("sun.awt.exception.handler", MyExceptionHandler.class.getName());
"それ以外の場合はJVMが処理します。"より正確に言えば、例外を発生させたスレッドは静かに死ぬでしょう。 –
@Stephen:実際には、stderrに例外が表示されます。 – Draemon
本当ですか?それはJVM固有のものでなければなりません...なぜなら、私はスタックトレースがないためにトリップされたからです。 –
uncaughtException(Thread, Throwable)メソッドを実装するThreadGroupに割り当てることができます。
:AWTの例外ハンドラを使用しての
public class MyThreadGroup extends ThreadGroup {
public MyThreadGroup() {
super("My Thread Group");
}
public void uncaughtException(Thread t, Throwable ex) {
// Handle exception
}
}
Thread t = new Thread(new MyThreadGroup(), "My Thread") { ... };
t.start();
例ExecutorServiceExecutionExceptionの中にラップされた例外をキャッチできます。
これをもっと明確にするには、run()を呼び出さないでください。run()メソッドのコードを新しいスレッドで実行するためにスレッドでstart()を呼び出します。糸。 run()を直接呼び出すだけで、現在のスレッドでrunメソッドが実行されます。 – Nate