5

invokeLater()作業単位をAWTEDTに送信するためのシンプルさが気に入っています。バックグラウンドスレッド(SwingWorkerなど)に作業要求を送信するための同様のメカニズムがあると便利ですが、私が理解しているように、これらには、invokeLater()が依存するイベントキューイングおよびディスパッチメカニズムはありません。

その代わりに、他のスレッドがメッセージを送信するブロックキューをバックグラウンドスレッドに与えることになり、スレッドは基本的に受信ループを実行して、メッセージが到着するまでブロックします。

実際、これは、バックグラウンドスレッドでEDTのような動作を実装する方法とまったく同じである可能性があります(またはそうなるでしょうか?)。一方、私はスレッドが単に不活性にぶら下がっていて、空の目に見えないイベントディスパッチキューからディスパッチされたときに「ワークドロップレット」を処理するというシンプルさが好きです。Javaは、そのような「イベント駆動型ワーカースレッド」を作成する方法を提供しますか?それとも、結局のところ、メッセージキューはこれを行う正しい方法ですか?invokeLater()また、関連して、メッセージパッシングの手法には欠点がありますか?

4

2 に答える 2

3

生産者/消費者設計パターン(ブロッキングキューで採用しているもの)は、異なるクラスの問題を解決するための異なるアプローチです。EDTはワーカーデザインパターンを採用しています。両方のデザインパターンを見て、どちらがニーズに最も適しているかを確認してください。

  • 生産者/消費者パターンは、通常、複数のスレッドが独立したタスクを個別に実行している場合に使用されます。
  • EDTで採用されているワーカーパターンは、複数のタスクの結果を1つのスレッド(この場合はGUIスレッド)に集めるために使用されます。

もちろん、単一のキューと複数のプロデューサーを持つ単一のコンシューマーがある場合は、プロデューサー-コンシューマーパターンを使用してワーカーパターンと同様の動作を実現できますが、これはデザインパターンの柔軟性を強調するだけです。つまり、ここでも重要なのは、デザインパターンの選択は、特定の状況に最適なものに基づいているということです。パターンが希望する動作に対応するのに十分な柔軟性がある場合、特に間違った選択はありません。

于 2011-08-12T18:40:03.930 に答える
1

java.util.concurrent、より具体的にはExecutorを確認する必要があります。これは通常、次のような要求を処理できる単なるスレッドプールですexecutor.execute(runnableTask);。単一のスレッドですべてのリクエストを処理する場合は、単一のスレッドでスレッドを作成しますexecutor = Executors.newSingleThreadExecutor()'。タスクが完了したときに値を返すことができるExecutorServiceもあります。

于 2011-08-12T18:38:29.677 に答える