2009-07-28 14 views
11

スレッド上でrun()メソッドを呼び出し、run()メソッドがキャッチされなかった例外をスローすると、結果はどうなりますか?スレッドが例外をスローするとどうなりますか?

誰がこの例外をキャッチしますか?捕まえられるの?

+5

これをもっと明確にするには、run()を呼び出さないでください。run()メソッドのコードを新しいスレッドで実行するためにスレッドでstart()を呼び出します。糸。 run()を直接呼び出すだけで、現在のスレッドでrunメソッドが実行されます。 – Nate

答えて

8

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()); 
+3

"それ以外の場合はJVMが処理します。"より正確に言えば、例外を発生させたスレッドは静かに死ぬでしょう。 –

+0

@Stephen:実際には、stderrに例外が表示されます。 – Draemon

+0

本当ですか?それはJVM固有のものでなければなりません...なぜなら、私はスタックトレースがないためにトリップされたからです。 –

1

: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の中にラップされた例外をキャッチできます。

関連する問題