keep moving!

We must not cease from exploration. And the end of all our exploring will be to arrive where we began and to know the place for the first time.
随笔 - 37, 文章 - 2, 评论 - 3, 引用 - 0
数据加载中……

Design Pattern: Guarded Suspension 模式

考慮這麼一個伺服器,它可以處理來自多個客戶端的服務請求(Request),為了不丟失客戶的請求,它要維持一個緩衝區,客戶的請求會先儲存至緩衝區中,而伺服器會從緩衝區中取出請求並執行,如果緩衝區中沒有請求,則伺服器就等待,直到被通知有新的請求存入緩衝區中,伺服器再度進行請求的執行。

關於這個描述的一個簡單 UML 順序圖如下所示:
GuardedSuspension

首先要考慮到,緩衝區會同時被兩個以上的執行緒進行存取,即伺服器的請求處理執行緒與客戶端執行緒,所以必須對緩衝區進行防護。

再來是當緩衝區中沒有請求時,伺服器必須等待直到被通知有新的請求。

Guarded Suspension模式關注的是執行的流程架構,以Java來實現這個架構的話如下所示:
  • RequestQueue.java
public class RequestQueue {
private java.util.LinkedList queue;
public RequestQueue() {
queue = new java.util.LinkedList();
}

public synchronized Request getRequest() {
while(queue.size() <= 0) {
try {
wait();
}
catch(InterruptedException e) {}
}
return (Request) queue.removeFirst();
}

public synchronized void putRequest(Request request) {
queue.addLast(request);
notifyAll();
}
}

一個例子是多人聊天伺服器,請求可能只是一個客戶端送出的聊天訊息,聊天訊息會先存至緩衝區中,伺服器會不斷的從緩衝區中取出聊天訊息並發給客戶端,如果緩衝區中沒有新訊息,則伺服器就進入等待,直到有一個客戶端發出聊天訊息並存入緩衝區中,此時伺服器再度被通知,然後再度取出訊息並進行發送。


张金鹏 2007-04-17 10:54 发表评论

文章来源:http://www.blogjava.net/jesson2005/articles/111194.html

posted on 2008-09-07 11:06 大石头 阅读(163) 评论(0)  编辑  收藏 所属分类: 多线程


只有注册用户登录后才能发表评论。


网站导航: