multi thread 8

Worker Thread パターン

  • Client 役(仕事のリクエストを作成しChannel役に渡す.渡したら結果を待たずにNonBlockで自分は返る)
  • Channel 役(Client役から受け取ったリクエストをWorker役に渡す.リクエストはキューやスタックのようにして保持される)
  • Worker 役(Channel役から受け取ったリクエストを実行する)

Invocation(スレッドの起動)とExecution(スレッドの実行)の分離を行うことで非同期な動作パターンを実現するのはThread-Par-Messageなどと一緒である.ClientはChannelにリクエスト(Runnableインスタンス)を渡しておく.WorkerThreadはChannelリクエストに溜まったリクエストを順に処理する.

これにより,スループットの向上が見込める.
スレッドを新しく起動するというのは時間がかかる.なので,スレッドをあらかじめ作成しておき,そのスレッドに順にリクエストを渡して処理を行う,とリクエストごとにスレッドを起動させることがないのでスループットが向上する.
ただし,Clientは結果を待たずに帰るので,Workerの実行結果を得たい場合には,Futureパターンを使うことになる.

GUIアプリケーションを作成する場合,スループットの向上は必須である.Swingを使ってGUIアプリケーションを作成する場合には,Swingのイベント・ディスパッチング・スレッドを意識する必要がある.
「ボタンを押す」などの動作の事象はイベントと呼ばれ,java.awt.event.ActionEvent のようなクラスとして表現される.そして,それぞれのインスタンスはSwingが内部に持っているイベントキューに蓄えられる.
よく「リスナーを登録する」とあるのは,そのコンポーネント上でイベントが発生した時に「イベント・ディスパッチング・スレッド」が,メソッドを呼び出す先のインスタンスを指定しているのである.

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中