細(xì)心!用心!耐心!

          吾非文人,乃市井一俗人也,讀百卷書,跨江河千里,故申城一游; 一兩滴辛酸,三四年學(xué)業(yè),五六點(diǎn)粗墨,七八筆買賣,九十道人情。

          BlogJava 聯(lián)系 聚合 管理
            1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks
          考慮這麼一個(gè)伺服器,它可以處理來自多個(gè)客戶端的服務(wù)請求(Request),為了不丟失客戶的請求,它要維持一個(gè)緩衝區(qū),客戶的請求會(huì)先儲(chǔ)存至緩衝區(qū)中,而伺服器會(huì)從緩衝區(qū)中取出請求並執(zhí)行,如果緩衝區(qū)中沒有請求,則伺服器就等待,直到被通知有新的請求存入緩衝區(qū)中,伺服器再度進(jìn)行請求的執(zhí)行。

          關(guān)於這個(gè)描述的一個(gè)簡單 UML 順序圖如下所示:
          GuardedSuspension

          首先要考慮到,緩衝區(qū)會(huì)同時(shí)被兩個(gè)以上的執(zhí)行緒進(jìn)行存取,即伺服器的請求處理執(zhí)行緒與客戶端執(zhí)行緒,所以必須對(duì)緩衝區(qū)進(jìn)行防護(hù)。

          再來是當(dāng)緩衝區(qū)中沒有請求時(shí),伺服器必須等待直到被通知有新的請求。

          Guarded Suspension模式關(guān)注的是執(zhí)行的流程架構(gòu),以Java來實(shí)現(xiàn)這個(gè)架構(gòu)的話如下所示:
          • 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();
          }
          }

          一個(gè)例子是多人聊天伺服器,請求可能只是一個(gè)客戶端送出的聊天訊息,聊天訊息會(huì)先存至緩衝區(qū)中,伺服器會(huì)不斷的從緩衝區(qū)中取出聊天訊息並發(fā)給客戶端,如果緩衝區(qū)中沒有新訊息,則伺服器就進(jìn)入等待,直到有一個(gè)客戶端發(fā)出聊天訊息並存入緩衝區(qū)中,此時(shí)伺服器再度被通知,然後再度取出訊息並進(jìn)行發(fā)送。
          posted on 2007-04-17 10:54 張金鵬 閱讀(306) 評(píng)論(0)  編輯  收藏 所屬分類: 多執(zhí)行緒模式
          主站蜘蛛池模板: 蒙自县| 固安县| 莱州市| 韶关市| 松江区| 九龙县| 雷波县| 轮台县| 福建省| 云龙县| 加查县| 普定县| 探索| 乌兰县| 宁晋县| 天祝| 宁蒗| 大理市| 新兴县| 新昌县| 农安县| 灵武市| 沾化县| 阿合奇县| 九龙城区| 芦山县| 宣武区| 南召县| 思南县| 沙河市| 炉霍县| 都兰县| 绥芬河市| 彝良县| 万荣县| 镇赉县| 九龙县| 瑞丽市| 芦山县| 香格里拉县| 长海县|