14

java.util.concurrent パッケージと Future インターフェースを参照すると、長いタスクを開始して進行状況を照会できる機能は、SwingWorker 実装クラスにのみ付属していることに気付きました (間違っていなければ)。

これは、次の疑問を投げかけます。

非 GUI、非 Swing アプリケーション (コンソール アプリケーションをイメージする) で、バックグラウンドで長いタスクを開始し、他のスレッドが進行状況を検査できるようにする方法はありますか? この機能をスイング/GUI アプリケーションに限定すべき理由はないように思えます。それ以外の場合、私が見る限り、使用可能な唯一のオプションは、Future オブジェクトを返す ExecutorService::submit を経由することです。ただし、基本の Future インターフェイスでは、進行状況を監視できません。

4

3 に答える 3

5

明らかに、Future オブジェクトは、ブロックしてから結果を受け取る場合にのみ適しています。

送信する Runnable または Callable オブジェクトは、この進行状況 (完了率、試行回数、ステータス (enum?) など) を提供する方法を認識し、それをオブジェクト自体への API 呼び出しとして提供するか、ルックアップに投稿する必要があります。リソース (必要に応じてメモリ マップまたはデータベース内)。簡単にするために、私はオブジェクト自体を好む傾向があります。特に、オブジェクトまたはオブジェクト自体への参照を検索するためにハンドル (id) が必要になる可能性が最も高いためです。

これは、3 つのスレッドが動作していることを意味します。1 つは実際の作業用で、1 つは結果を待っている間にブロックされ、1 つは監視スレッドです。最後の 1 つは、要件に応じて共有できます。

于 2010-02-16T20:08:45.257 に答える
2

クライアントプログラムがすべてを正しく調整および同期することを心配することなく、長時間実行されるタスクの進行状況を最新の状態に保つための標準的な同時実行フレームワークの方法があることを望んでいました。通常のメソッドとメソッドに加えて、Future<T>サポートするインターフェイス の拡張バージョンを理解できるように思えました。明らかに、の実装ではオブジェクトを直接ポーリングする必要があるため、次のインターフェイスは次のように指定する必要があります。public short progress();isDone()get()progress()Future<T>Future<T extends CanReportProgress>CanReportProgress

public interface CanReportProgress {
    public short progress();
}

Futureこれは、進行状況を取得するためにオブジェクト自体を呼び出すのではなく、なぜオブジェクトをわざわざ通過するのかという疑問を投げかけます。知らない。もっと考えなければなりません。/Callableを呼び出した後、クライアントプログラマーがオブジェクト自体に再度アクセスすることはないため、現在のコントラクト/セマンティクスに近いと主張することができます。ExecutorService::submitexecute

于 2010-02-17T08:36:07.993 に答える
2

私の場合、メソッドへのパラメーターとして、処理するオブジェクトを含むHashSetを渡しました。これは、呼び出し元のクラスでインスタンス変数として作成されました。非同期メソッドが処理後にオブジェクトを削除すると、呼び出し元のメソッドに残っているマップのサイズを取得できます。私は一般的に、オブジェクトを参照で渡すことで問題を解決します。

于 2011-05-26T12:37:44.783 に答える