スレッドからメインスレッドへの例外をラッパー(別クラス)にキューイングすることにより、java内にいくつかのコードを書き込んでいます。ラッパーに例外が存在すると、スレッドは終了します。その後、メインスレッドで例外をスローする必要があります。メインスレッドで呼び出される標準のJavaイベントはないようですので、スレッドのジョイン機能をどこかで使用しなければなりませんでした。メインスレッドではjoinを使用できません。なぜなら、メインスレッドはブロックするからです。私は別のスレッドでそれを使用することはできません、私はもう例外をスローすることはできませんでした。私はメインスレッドに例外をスローする他の方法は考えられません。誰でもここにアイデアがありますか?スレッド内のJava例外
答えて
@Ryan Stewartが述べたように、Executrosフレームワークを使用することができます。この場合、自分でスレッドを作成することはありません。大兄弟は、それを行うのに役立ちます。 RunnableではなくCallableを使用してロジックを実装することができます。この場合、Futureを取得してスレッドのステータスを確認することができます。
私は恐らく未来を積極的に呼び出さなければならないので、これは部分的にしか役に立たないと思います。
私が正しく理解している場合、例外がwrorkerスレッドの1つによってスローされたときにメインスレッドに通知されます。私はあなたがワーカースレッドから例外を取得し、メインスレッドで再スローする必要はないと思う。
次のいずれかの方法をお勧めします。
aリスナーパターンを使用します。作成
interface ExceptionListener {
public void exceptionThrown(Exception e);
}
作成abstract class ExceptionNotifierThread extends Thread
このクラスはExceptionListenerとメソッドaddExceptionListener(ExceptionListener l)
のコレクションを持ちます。
スレッドのrun()
メソッドは、すべての例外を捕捉し、ループ内のすべての例外リスナーを呼び出します。
あなたのスレッドをクレテッとし、そのstart()
メソッドを呼び出す前に、エキスパートリスナーとして登録することができます。
これだけです。スレッドが例外をスローすると、リスナーが呼び出されます。
B.これは同じ解決策のバージョンです。リスナの通知を同期的に行うのではなく、スレッドが私のプッシュ・エクセプションをキューに入れ、誰もがキューからそれを読むことができます。ユーザーのエグゼキュータとブロック用のキュー。
幸運にも幸運にも、stackoverflowへようこそ!
ExecutorServiceを使用してスレッドを実行し、Future.get()を使用して、実行されたタスクや発生した例外の結果を取得します。
例を投稿できますか?メインスレッドが 'future.get'関数を呼び出すことによってどのようにブロックされないのか分かりません。 –
@niomaster:あなたのメインスレッドが何をしているのか分かりません。ブロックせずにタスクの状態を確認したい場合は、[Future.isDone()](http://download.oracle.com)を使用してください。com/javase/6/docs/api/java/util/concurrent/Future.html#isDone%28%29)を使用してください。 –
executorServiceを使用して、実行されたタスクや発生した例外の結果を得るためにスレッドとFuture.get()を実行します。
- 1. スレッド内のJava例外EOFException
- 2. javaスレッド例外
- 3. スレッド "main"のJava例外java.util.UnknownFormatConversionException:Conversion = ' - '
- 4. 「例外スレッド」のJavaエラー
- 5. スレッド内の例外 "weblogic.transaction.TxTimer: '1'
- 6. スレッド「main」内の例外
- 7. Javaは:スレッドの例外「メイン」java.lang.NoClassDefFoundErrorが(2)
- 8. Hadoop Javaエラー:スレッド "main"の例外java.lang.ClassNotFoundException:Titanic
- 9. Java:スレッド「AWT-EventQueue-0」の例外java.lang.NullPointerException?
- 10. Javaエラー:スレッド "main"の例外java.lang.ArrayIndexOutOfBoundsException:6
- 11. Javaエラー:スレッド "main" java.lang.IndexOutOfBoundsExceptionの例外:
- 12. スレッド内でのエラー(例外)のスロー
- 13. ローリングダイスプログラムの "スレッド内の例外"メイン "java.lang.NullPointerException"エラー
- 14. スレッド内の例外の処理
- 15. スレッド内の例外 "Twitter4J Async Dispatcher [0]" java.lang.NoClassDefFoundError
- 16. "スレッド内の例外" main "java.lang.StackOverflowError"エラー?
- 17. Java不正なスレッド状態例外コーディングエラー
- 18. スレッド「メイン」の例外ハイブの例外
- 19. 例外::スレッド
- 20. スレッド「main」の例外
- 21. Androidスレッドの例外
- 22. スレッド "HazelcastSessionCleaner"の例外
- 23. Androidスレッドの例外
- 24. スレッド "main"の例外例外:main "java.lang.NumberFormatException:null
- 25. スレッド "main"内の例外java.lang.ArrayIndexOutOfBoundsException:境界外の座標setRGB
- 26. この例外を取り除く方法 "スレッド内の例外" main "java.lang.UnsatisfiedLinkError:java.library.pathのjniopencv_objdetect"
- 27. Ruby Unicorn - スレッド例外
- 28. Python - スレッド内の例外Thread-1(__bootstrap_inner内)
- 29. Javaのスレッド内のスレッド?
- 30. スレッド "main"の例外java.lang.NoSuchFieldError:DEF_CONTENT_CHARSET
問題を説明するためのサンプルコードを投稿できますか?一見すると、ラッパースレッドのrun()メソッドで例外をキャッチしているようです。その例外ハンドラでは、メインスレッドのいくつかのメソッドに例外を渡すことができます。 –