Thread-Per-Message パターン
* スレッド(Client)がインスタンス(Host)のメソッドを呼び出している場合、 メソッド処理が終了するまでインスタンス(Host)から制御が戻ってこない * インスタンス(Host)が処理用のスレッドを新たに起動し、処理を任せる * スレッド(Client)にはすぐに応答する
目的
* 命令の「要求」と実際の「処理」を分離するパターン => メソッドの起動(invocation)と実行(execution)を分離する
利点
* 応答性の向上 * 分散処理
他の関連パターン
* Futureパターン : 処理結果を戻したい場合http://blogs.yahoo.co.jp/dk521123/32918692.html
* Worker Threadパターン : スレッドを使いまわしたい場合http://blogs.yahoo.co.jp/dk521123/32918314.html
サンプル
* 参考文献などのサンプルを見て自分なりに修正したので違うかもしれないが
Main.java
public class Main { public static void main(String[] args) { System.out.println("Start..."); RequestManager manager = new RequestManager(); manager.request("Task001", "Cooking"); manager.request("Task002", "Cleaning"); manager.request("Task003", "Washing dishes"); System.out.println("Done"); } }
RequestManager.java
public class RequestManager { public void request(final String taskId, final String taskName) { System.out.println("Start request => Task ID : " + taskId + " Task Name : " + taskName); WorkThread helper = new WorkThread(taskId, taskName); helper.start(); System.out.println("Done for request => Task ID : " + taskId + " Task Name : " + taskName); } }
WorkThread.java
public class WorkThread extends Thread { private String taskId; private String taskName; public WorkThread (final String taskId, final String taskName) { this.taskId = taskId; this.taskName = taskName; } public void run() { System.out.println("Start => Task ID : " + this.taskId + " Task Name : " + this.taskName); for (int i = 0; i < 6; i++) { this.heavyWork(); System.out.println(Thread.currentThread().getName() + " : " + this.taskName + " is doing"); } System.out.println("Done => Task ID : " + this.taskId + " Task Name : " + this.taskName); } private void heavyWork() { try { Thread.sleep(1000); } catch (InterruptedException ignore) { } } }
出力結果
Start... Start request => Task ID : Task001 Task Name : Cooking Done for request => Task ID : Task001 Task Name : Cooking Start request => Task ID : Task002 Task Name : Cleaning Start => Task ID : Task001 Task Name : Cooking Done for request => Task ID : Task002 Task Name : Cleaning Start request => Task ID : Task003 Task Name : Washing dishes Start => Task ID : Task002 Task Name : Cleaning Done for request => Task ID : Task003 Task Name : Washing dishes Done Start => Task ID : Task003 Task Name : Washing dishes Thread-0 : Cooking is doing Thread-1 : Cleaning is doing Thread-2 : Washing dishes is doing Thread-0 : Cooking is doing Thread-1 : Cleaning is doing Thread-2 : Washing dishes is doing Thread-0 : Cooking is doing Thread-1 : Cleaning is doing Thread-2 : Washing dishes is doing Thread-0 : Cooking is doing Thread-1 : Cleaning is doing Thread-2 : Washing dishes is doing Thread-0 : Cooking is doing Thread-2 : Washing dishes is doing Thread-1 : Cleaning is doing Thread-0 : Cooking is doing Done => Task ID : Task001 Task Name : Cooking Thread-2 : Washing dishes is doing Thread-1 : Cleaning is doing Done => Task ID : Task003 Task Name : Washing dishes Done => Task ID : Task002 Task Name : Cleaning
参考文献
http://d.hatena.ne.jp/tubaki56/20111002/1317546166http://blog.codebook-10000.com/entry/20130120/1358696607