フューチャーオブジェクトの進捗状況を取得する機能
-
21-09-2019 - |
質問
java.util.concurrentパッケージと今後のインタフェースを参照して(私が間違っていなければ)私は長い作業を開始し、進捗状況を照会することができるようにする能力が唯一のSwingWorkerの実装クラスが付属していることに注意してください。
これは、次の質問を頼みます
の方法は、バックグラウンドでの長いタスクを開始し、他のスレッドが進捗状況を検査することを可能にする(コンソールアプリケーションを画像化)非GUI、非Swingアプリケーションでは、ありますか?この機能は/ GUIアプリケーションをスイングするために限定されるべきでない理由がないように私には思えます。それ以外の場合は、唯一可能な選択肢、私はそれを参照してください方法は、:: Futureオブジェクトを返す提出ExecutorServiceの通過することです。しかし、ベース今後のインターフェースは、進捗状況をモニタリングすることはできません。
解決
もちろん、今後のオブジェクトのみをブロックし、その後、結果を受け取るために良いでしょう。
あなたが提出したRunnableまたはCallableオブジェクトは、この進捗状況(完了した割合、試行の回数、状態(列挙型?)など)を提供し、オブジェクト自体へのAPI呼び出しとしてそれを提供する方法を知っている必要があり、または掲載しまうのいずれか(メモリマップやデータベース必要に応じて)いくつかのルックアップリソースインチ簡単にするために私はあなたが最も可能性の高いオブジェクトまたはオブジェクト自体への参照をルックアップするためにハンドル(ID)を必要とします。
つもりだ、特に以来、オブジェクト自体が好きな傾向にありますこれは、あなたが3つのスレッドを操作していることを意味しています。監視スレッドであり、実際の結果を待つ間にブロックされている作業、1、1 1。最後のものは、あなたの要件に応じて共有することができます。
他のヒント
私の場合は、HashSetのを渡され、処理するためのオブジェクトで、メソッドのパラメータとして、ウィッヒは、呼び出し元のクラスにインスタンス変数として作成されました。 asyncronous方法は、処理した後にオブジェクトを削除する場合は1を呼び出す方法に残っている地図のサイズを取得することができます。 I参照による一般的なパッシングオブジェクト内のものは、問題を解決します。
私が結集し、すべてを正しく同期を心配するクライアントプログラムを必要とせずに、実行時間の長いタスクの進捗に更新滞在するための標準的な並行処理フレームワークの方法があったことを願っていました。これは、サポートするFuture<T>
インタフェースの拡張版を尋ことができることを一つに私には思えました。
通常のpublic short progress();
とisDone()
方法に加えてget()
。
明らかにprogress()
の実装は、オブジェクトをポーリングする必要があります直接ので、多分Future<T>
がFuture<T extends CanReportProgress>
として指定する必要がどこCanReportProgress
で、次のインタフェースます:
public interface CanReportProgress {
public short progress();
}
これは、1つの進行状況を取得するには、オブジェクト自体を呼び出すこととは対照的に、Future
オブジェクトを介して行くことを気にする理由の質問を頼みます。知りません。私はそれをより多くの思考を与える必要があります。 Callable
オブジェクトは/ ExecutorService::submit
をexecute
を呼び出した後、クライアントのプログラマによって再度アクセス、そのものではないことにより、それが現在の契約/意味論に近いと主張することができます。