2011-07-31 20 views
2

スレッドからメインスレッドへの例外をラッパー(別クラス)にキューイングすることにより、java内にいくつかのコードを書き込んでいます。ラッパーに例外が存在すると、スレッドは終了します。その後、メインスレッドで例外をスローする必要があります。メインスレッドで呼び出される標準のJavaイベントはないようですので、スレッドのジョイン機能をどこかで使用しなければなりませんでした。メインスレッドではjoinを使用できません。なぜなら、メインスレッドはブロックするからです。私は別のスレッドでそれを使用することはできません、私はもう例外をスローすることはできませんでした。私はメインスレッドに例外をスローする他の方法は考えられません。誰でもここにアイデアがありますか?スレッド内のJava例外

+0

問題を説明するためのサンプルコードを投稿できますか?一見すると、ラッパースレッドのrun()メソッドで例外をキャッチしているようです。その例外ハンドラでは、メインスレッドのいくつかのメソッドに例外を渡すことができます。 –

答えて

0

@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へようこそ!

3

ExecutorServiceを使用してスレッドを実行し、Future.get()を使用して、実行されたタスクや発生した例外の結果を取得します。

+0

例を投稿できますか?メインスレッドが 'future.get'関数を呼び出すことによってどのようにブロックされないのか分かりません。 –

+0

@niomaster:あなたのメインスレッドが何をしているのか分かりません。ブロックせずにタスクの状態を確認したい場合は、[Future.isDone()](http://download.oracle.com)を使用してください。com/javase/6/docs/api/java/util/concurrent/Future.html#isDone%28%29)を使用してください。 –

1

executorServiceを使用して、実行されたタスクや発生した例外の結果を得るためにスレッドとFuture.get()を実行します。

関連する問題