2011-07-12 19 views
21

スレッドがmainメソッドから開始されたとします。スレッド内で例外がスローされますが、スレッド内では処理されない場合はどうなりますか?javaスレッド例外

例外をメインメソッドに戻すことは可能ですか?

答えて

32

Thread.runメソッドからスローされたチェックされていない例外について説明しています。デフォルトで 、あなたはシステムエラーにこのようSTHを取得します:

Exception in thread "Thread-0" java.lang.RuntimeException 
    at Main$1.run(Main.java:11) 
    at java.lang.Thread.run(Thread.java:619) 

これは、未処理の例外のためのprintStackTraceの結果です。すべてのスレッドが静的メソッドThread.setDefaultUncaughtExceptionHandlerを使用するためのハンドラを設定するには

Thread t = new Thread(new Runnable(){ 
     public void run() { 
      throw new RuntimeException(); 
     }  
    }); 
    t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 

     public void uncaughtException(Thread t, Throwable e) { 
      System.out.println("exception " + e + " from thread " + t); 
     } 
    }); 
    t.start(); 

:それを処理するには、独自たuncaughtExceptionHandlerを追加することができます。

0

例外がtry {} catch (Exception e){}によって処理されない場合、呼び出されて機能するようにスローされます。

それは別のスタンドアロンスレッドである場合は、スレッド

それともここでいくつかの他の情報の親されていないオブジェクトに伝播することはできません:あなたは例外を自分で実装していない場合は、How to throw a checked exception from a java thread?

0

通常、例外が発生すると、実行を終了します。

+0

スレッドが発生するのは –

3

いいえ、できません。それについて考えると、main()メソッドは数日前に終了している可能性があります。

スレッドからキャッチされていない例外はすべて、スレッドのUncaughtExceptionHandlerに伝播されます。定義されていない場合は、スレッドグループのハンドラに移動します。スレッドグループのハンドラも設定されていない場合は、デフォルトのハンドラに移動します。

+0

「昨日」についての回答の最初の行は、この問題をよりよく理解するのに役立ちました。事実、複数のスレッドは、(容易に)データを共有する別々のプロセスのように動作することができます。別個のプロセスと共有メモリを使用して、まったく同じモデルを構築できます(難しいものもあります)。 – kevinarpe

0

例外は、UncaughtExceptionHandlerによってキャッチされます。あなたはそれをキャッチして、必要に応じてメインスレッドに戻すことができます。

5

例外がキャッチされ、そのスレッドで実行されているコードによって処理された場合は処理されますが、catchブロックロジックが書き込まれます。私はこの答えの残りの部分について、あなたが捕らえられていない例外について話していると仮定します。

キャッチされない例外は、スレッドを終了させます。それがThread.run()の上部に泡を描くと、それはスレッドのUncaughtExceptionHandlerによって処理されます。デフォルトでは、スタックトレースはコンソールに表示されます。スレッド自体はこの時点で終了します。run()メソッドが終了したため、実際にはスレッドを続行できませんでした。

メインスレッドで例外を再発生させたい場合、これを行うUncaughtExceptionHandlerを定義することができます(これは非常に単純なインタフェースです)。作成後に生成されたスレッドのThread.setUncaughtExceptionHandlerを呼び出し、カスタム例外ハンドラ。


ザ・どこで、どのように正確にハンドラが決定され、あなたのメインスレッドにスロー可能オブジェクトを「挿入」するつもりの書き込みについてのみ、潜在的にトリッキーな部分。あなたのスレッドが何か他のことをしていない場合、これは完全には明白ではありません。アプリケーションをどのように設計し、どのような同時サポートがあるかに大きく依存します。

(メインスレッドがもう一方のスレッドを実行するのを待っている場合、それは簡単になりますが、この場合、メインスレッドはスレッドExecutorServiceにタスクをサブミットし、 Future、この配線/ライフサイクルのすべてを処理しますか?

関連する問題