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.aygfsteel.com/jesson2005/articles/111194.html

          posted on 2008-09-07 11:06 大石頭 閱讀(172) 評論(0)  編輯  收藏 所屬分類: 多線程

          主站蜘蛛池模板: 东平县| 舒兰市| 阳新县| 华阴市| 乌恰县| 确山县| 宜阳县| 壤塘县| 石楼县| 资兴市| 汶川县| 岳池县| 宝鸡市| 甘洛县| 榕江县| 安陆市| 南平市| 闵行区| 新民市| 商洛市| 汶上县| 宝清县| 柞水县| 大田县| 启东市| 洪泽县| 基隆市| 黑水县| 安达市| 库车县| 赣州市| 天峻县| 仙游县| 西充县| 托克逊县| 襄城县| 深圳市| 遂溪县| 岗巴县| 阿瓦提县| 科尔|