2011-01-27 12 views
2

これは多分広い質問ですが、私はモノラルユーザーのデスクトップアプリケーションで並行処理が一般的にどこに使用されているかを知りたいと思います。並行性の問題が発生する可能性のあるケース(設計段階で、理想的に)をどのように見つけますか?スイング - 一般的なデスクトップアプリケーションの同時実行性

P.S:OS理論からは、並行処理の問題は通常、リソースを共有できない場合(例:プリンタ)に発生します。私はまだプログラミングのレベルでこれが起こるかもしれないところで霧がかかっています。

答えて

5

Event Dispatch threadと他のロジック間のSwingにスレッドの問題がある可能性があります。 EDTで長時間実行されるコードを実行することは、通常は悪い考えです。これは、ユーザーインターフェイスが、コードの実行を待っているときにロックされているように見えるためです。これに対する解決策は、新しいスレッドを作成するProgressWorkerで長時間実行するコードを実行することです。

ここで問題が発生します。 workerとEventDispatchの両方のスレッドが同時に変更している場合は、並行性の問題が発生する可能性があります(別のスレッドが変更している間にリストをループすると想像してください)。しかし、スイングコードはイベントディスパッチスレッドのSwingコンポーネントのみを変更するため、通常は問題にはなりません。

3

あなたが共同編集ツールを作成しているとします。 GUIスレッドはユーザーからの入力を受け取り、ネットワークスレッドは他のユーザーによる更新を受け取ります。これらの2つのスレッドは、編集中のテキストの状態を表すオブジェクトに同時にアクセスする必要があり、そのオブジェクトへのアクセスは、ミューテックスまたはその他の同期プリミティブを使用してシリアル化する必要があります。

3

一般に、これは、実行中のタスクを実行する必要がある場合、イベントディスパッチスレッドで実行された場合、完了している間に目立つようにロックされます。だから、インターネット、重い処理、ディスクのI/Oなどからのページをつかむことは、イベントディスパッチスレッドではなく、別のスレッドとしての方が良いでしょう。

これらの状況に対処するには、わずかですが一般的には最も良いツールはSwingWorkerです。これにより、タスクは別のスレッドで実行され、そのスレッドの進行状況と完了のスイングにスレッドセーフな方法で通知されます。

3

明確にするために、ちらつきの問題が発生するのは、hereのようなものです。大きなサイズの画像を読み込んで表示するスイングでプログラムされた画像表示器を想像することもできます。スイングワーカーに正しくスレッドされていないと、コンポーネントが設定されるのと同時にイメージが読み込まれるのを待つので、ユーザーエクスペリエンスが低下する可能性があります。ので、あなたの第二qn-答えるために

同時実行 問題が生じる可能性がどこに(理想的には、設計段階で )ケースを発見するにはどうすればよい

リソースが集中する操作が発生している場所(画像の読み込みなど)を特定し、スイングワーカースレッドに配置できます。

  • 時間がかかる作業は、イベントディスパッチスレッドで実行されるべきではありません。 それ以外の場合、アプリケーションは応答しなくなります。
  • スイングコンポーネントは、イベントディスパッチスレッドでのみアクセスされる である必要があります。

source

関連する問題