【デザインパターン】【非同期】Thread-Per-Message パターン

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://blogs.yahoo.co.jp/dk521123/34195603.html