2011-08-12 10 views
5

AWT EDTに作業単位を送信するための簡潔さはinvokeLater()です。バックグラウンドスレッド(SwingWorkerなど)に作業要求を送信するための同様のメカニズムを持つのは良いことですが、わかっているので、これらはinvokeLater()が依存するものであるイベントキュー&ディスパッチメカニズムを一切備えていません。Javaで「イベント駆動型」バックグラウンドスレッドを作成するにはどうすればよいですか?

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

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

答えて

1

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

+0

私が探していた「ディスパッチング」についてはよく知っているが、提供していないようだ。 – Chap

+0

シングルスレッドエグゼキュータで実行可能ファイルを送信することは、EDTで実行可能ファイルを送信することとまったく同じです。タスクは処理のためにキューに入れられ、スレッドは現在のジョブがない場合は待機しています。 – toto2

+0

@Chap他の回答のコメントであなたの問題の説明を読んでいましたが、あなたが探しているスレッドのエグゼキュータが1つしかないようです。 – toto2

3

Producer-Consumer Design Patter(ブロッキングキューで採用しているもの)は、さまざまな種類の問題を解決するためのアプローチとは異なります。 EDTはWorker Design Patternを採用しています。両方のデザインパターンを見て、どれがあなたのニーズに最も適しているかを見てください。

  • プロデューサ - コンシューマパターンは、独立したタスクを別々に実行する複数のスレッドがある場合に、一般的に使用されます。
  • EDTが使用するWorkerパターンを使用して、の複数のタスクの結果を単一のスレッド(この場合はGUIスレッド)に転送します()。

単一のキューと複数のプロデューサを持つ単一のコンシューマがあれば、プロデューサ - コンシューマパターンを使用して同様の動作をWorkerパターンに適用できますが、デザインパターンの柔軟性が強調されます。つまり、デザインパターンを選択することは、あなたの特定の状況に最も適したものに基づいているということです。パターンがあなたの望むふるまいに適応できるほど柔軟である場合、特に間違った選択はありません。

+0

コントラストパターンを識別するための+1 – Chap

+0

私の状況では、ワーカーパターンが必ず必要です。各タスクは、1つのスレッドで連続して処理する必要があります。しかし、あなたはSwingWorkerにリンクしました - 私はその点を見逃しているかもしれませんが、同時に複数のSwingWorkerスレッドを生成することはできませんか?それは私にとってはうまくいかないでしょう。 – Chap

+0

'SwingWorker'は、複数のタスクがあるときにGUIがフリーズするのを防ぐために、ワーカーのデザインパターン(wikiページに描かれているもの)を採用しています。 'SwingWorker'が操作を終えると、SwingWorkerがコールバックするので、GUIの更新はまだGUIスレッドから行われます。あなたのコメントに基づいて、これは正しいアプローチのようには見えません。あなたの操作が単一のスレッドで行われることが必要な場合は、単一のコンシューマ(スレッド)と複数のプロデューサでプロデューサ - コンシューマパターンを使用し、コンシューマだけがそのタスクを実行できるようにします。 – Kiril

関連する問題