?? guardedsuspension.htm
字號:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="css/stdlayout.css" type="text/css">
<link rel="stylesheet" href="css/print.css" type="text/css">
<meta content="text/html; charset=gb2312" http-equiv="content-type">
<title>Guarded Suspension 模式</title>
</head>
<body>
<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>
<h1><a href="CppGossip.html">Design Pattern: Guarded Suspension 模式</a></h1>
考慮這么一個伺服器,它可以處理來自多個客戶端的服務請求(Request),為了不丟失客戶的請求,它要維持一個緩沖區,客戶的請求會先儲存至緩沖區
中,而伺服器會從緩沖區中取出請求并執行,如果緩沖區中沒有請求,則伺服器就等待,直到被通知有新的請求存入緩沖區中,伺服器再度進行請求的執行。<br>
<br>
關于這個描述的一個簡單 UML 順序圖如下所示: <br>
<div style="text-align: center;"><img style="width: 542px; height: 369px;" alt="GuardedSuspension" title="GuardedSuspension" src="images/guardedSuspension.jpg"><br>
</div>
<br>
首先要考慮到,緩沖區會同時被兩個以上的執行緒進行存取,即伺服器的請求處理執行緒與客戶端執行緒,所以必須對緩沖區進行防護。<br>
<br>
再來是當緩沖區中沒有請求時,伺服器必須等待直到被通知有新的請求。<br>
<br>
Guarded Suspension模式關注的是執行的流程架構,以Java來實現這個架構的話如下所示: <br>
<ul>
<li> RequestQueue.java
</li>
</ul>
<pre>public class RequestQueue {<br> private java.util.LinkedList queue;<br> public RequestQueue() {<br> queue = new java.util.LinkedList();<br> }<br><br> public synchronized Request getRequest() {<br> while(queue.size() <= 0) {<br> try {<br> wait();<br> }<br> catch(InterruptedException e) {}<br> }<br> return (Request) queue.removeFirst();<br> }<br><br> public synchronized void putRequest(Request request) {<br> queue.addLast(request);<br> notifyAll();<br> }<br>} <br></pre>
<br>
一個例子是多人聊天伺服器,請求可能只是一個客戶端送出的聊天訊息,聊天訊息會先存至緩沖區中,伺服器會不斷的從緩沖區中取出
聊天訊息并發給客戶端,如果緩沖區中沒有新訊息,則伺服器就進入等待,直到有一個客戶端發出聊天訊息并存入緩沖區中,此時伺服器再度被通知,然后再度取出
訊息并進行發送。<br>
<br>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -