0

GUI アプリケーションでのスレッドの使用について質問があります。(単純な例として)一連の画像を含むスイングアプリケーションがあるとします。親のイメージをそれぞれ取得する、実行したい2つのスレッドがあります。(そのため、指定された数の学生について、各サーバー エンドポイントから親イメージと親イメージを取得します)。父親と母親の返された画像は、画面上の画像に追加されるため、複数の学生の母親、父親、母親、父親の一連の画像があります。

マルチスレッド環境でこれをスケジュールするにはどうすればよいですか? マザーまたはファーザーの画像を取得するための各呼び出しは並行して行う必要があり、画面上の画像の表示を妨げないようにする必要があります。各スレッドが画像を返した後、画面に表示される画像は更新されますか? これはどのように構成されますか?

4

1 に答える 1

2

Swingの並行性から始めます。

最も簡単な方法はSwingWorker、検索する必要があるアイテムのリストを持つ を使用して、リストを処理できるようにすることです。

これの問題は、各リクエストを 1 つずつしか実行しないため、他のオプションよりも少し遅くなることです。これの利点は、UI に通知したり安全に変更したりできるように、イベント ディスパッチ スレッドと再同期するための簡単な機能を提供することです。

別のオプションは、 Executors、特にThread Pool実装を使用することです。

これにより、将来のある時点で実行する必要がある多数のタスクを送信できますが、プロセスが一度に使用できるスレッドの数を制御できます。

欠点は、UI を更新したい場合に、変更を UI に同期する必要があることです。SwingUtilities.invokeLater

今。両方を「使用できます」。

基本的に、関連情報を「マザー」サーバーと「ファーザー」サーバー、元のイメージ、および場合によっては何らかの種類のコールバック インターフェイスに渡すことができる、ある種の「リクエスト」クラスをセットアップする必要があります。最終的なイメージがレンダリングされたとき。

リクエスタは、何らかの種類のRunnableorCallableを構築し、SwingWorker.

実行されると、この「リクエスト タスク」が を開始しSwingWorker、画像をフェッチしてそれらとpublish結果をマージし、コールバック インターフェイスに通知します。「リクエストタスク」は、SwingWorker#get終了する前に戻るまで待つだけです。

アイデアとして...

于 2013-09-30T02:11:12.037 に答える