2

専用スレッドで実行するタスクを定期的に送信するアプリケーションがあります。これらのタスクFutureTask<V>とスレッドは、ジョブがキューに入るときにジョブを実行し、空の場合はスリープ状態になる無限ループにすぎません。

計算の結果を待つ必要がある場合もあるので、FutureTask の get() メソッドを呼び出します。これは、何か問題が発生した場合にも例外をスローします。しかし、結果がどうであったとしても気にしない場合がありますが、タスクの実行中に何らかの障害があったかどうかを知る必要があります (ログ、printStackTrace() など)。

必要のない get() を待たずにこれを達成する方法はありますか?

前もって感謝します!

UPDATE : タスクの実行後にランナー スレッドで get() を呼び出すことは、他の誰も結果を待たない場合に例外をキャッチする唯一の方法のように思われました。

もう 1 つの解決策は、FutureTask クラスを拡張して、Java リフレクションを介して sync.exception プライベート フィールドを公開するメソッドを提供することです。

4

5 に答える 5

0

Thread.UncaughtExceptionHandler を確認してください

于 2012-05-06T14:29:40.337 に答える
0

私がFuturetask用に書いた例を確認することもできます

于 2012-05-06T17:14:26.693 に答える
0

ここではCompletionServiceが可能性があります。それらのいずれかを使用すると、それらが確実に終了get()したら、 を呼び出すことができます。Futureあるいは、Guavaライブラリには、リスナーを に追加する方法FutureFutureTask、タスクが完了したときに実行する方法 (ListenableFutureおよびその関連オブジェクト) があります。

于 2012-05-06T15:13:02.670 に答える
0

あなたの問題を正しく理解していれば、簡単な解決策があります。専用のタスク ランナー スレッドを変更して、各タスクの実行後に呼び出すようにし、 (存在する場合)Future.get()をキャッチしてログに記録します。ExecutionException

getタスクの実行後にタスク ランナー スレッドを呼び出すと、ブロックされないことが保証されることに注意してください。

run()(フューチャーのラップされたRunnable will be caught byFutureTask.run()`のメソッドによって例外とエラーがスローされるため、キャッチされない例外ハンドラーは役に立ちません。)

于 2012-05-06T14:52:15.443 に答える
0

タスクからの失敗を報告するには、「setException」を使用する必要があると思います。get() が ExecutionException を報告するようにします。これも参照してください:

FutureTask で例外をキャッチする方法

于 2012-05-06T14:57:07.710 に答える