Guarded Suspension

マルチスレッドデザインパターン(著:結城さん)に書いてあった個人的にお気に入りのパターン。

データが不定期に飛んでくるネットワーク系で良く使った。

利点

class A
 ↓(データ)
Queue
 ↓(データ)
class B

イメージ的には普通のQueue。class Aとclass Bが別スレッドになっているのがポイント。



//Queueを持つクラス。
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
class GSQueue{
private final BlockingQueue QUEUE;
private static final GSQueue INSTANCE = new GSQueue();
private GSQueue(){
QUEUE = new LinkedBlockingQueue();
}
public static SGQueue getInatance(){
return INSTANCE;
}
public T getData(){
return QUEUE.take();
}
public void putData(T data){
if(data == null){
throw new NullPointerExceprion();
}else{
QUEUE.put(data)
}
}
}
GSQueueクラスは簡単に書くと上記のようになる。
設計上2つのクラスにまたがってインスタンスが生成されるので、シングルトンで設計している。
putData()メソッドは保持するキューにデータを入れるだけ。
getData()メソッドはキューからデータを取り出すだけ。
取り出すだけですが、キューにデータが無い場合には、データが入ってくるまで待機しているのが最大のポイントです。これはBlockingQueueクラスの恩恵。

で、使用する側のコード


//キューに突っ込むクラス
class A{
private GSQueue gs = GSQueue.getInstance();
private void runTest(){
this.gs.putData(data);
}
}


//キューからデータ取り出して利用するクラス
class B{
private GSQueue gs = GSQueue.getInstance();
private void runTest(){
while(true){
//ここでデータが来るまで待機している
//負荷もかからない。
T data = gs.getData();
//データが取得できたら以下で処理
}
}
}