前言 :
考慮這麼一個伺服器,它可以處理來自多個客戶端的服務請求(Request),為了迅速接受客戶的請求,它要維持一個請求佇列,客戶的請求會先儲存至請求佇列 中,服務元件會從緩衝區中取出請求並執行,如請求佇列區中沒有請求,服務元件就等待,直到被通知有新的請求存入請求佇列中,服務元件再度進行請求的執行.
關於這個描述的一個簡單 UML 順序圖如下所示 :
Guarded Suspension 模式 :
首先要考慮到,請求佇列會同時被兩個以上的執行緒進行存取,即伺服器執行緒與服務元件執行緒,所以必須對請求佇列進行防護,當請求佇列中沒有請求時,服務元件必須等待直到被通知有新的請求. Guarded Suspension模式強調的是對共用資料的防護,避免共用存取的競爭問題. 以Java來實現這個架構的話如下所示 :
- Request.java :
- package dp.thds.guardedsuspension;
- public interface Request {
- void execute();
- }
- package dp.thds.guardedsuspension;
- import java.util.LinkedList;
- public class RequestQueue {
- private LinkedList
requests; - RequestQueue() {
- requests = new LinkedList
(); - }
- synchronized Request get() {
- while(requests.size() == 0) {
- try {
- wait();
- }
- catch(InterruptedException e) {
- e.printStackTrace();
- }
- }
- return requests.removeFirst();
- }
- synchronized void put(Request request) {
- requests.addLast(request);
- notifyAll();
- }
- }
- Server.java : 模擬 Server 置入請求
- package dp.thds.guardedsuspension;
- public class Server implements Runnable {
- private RequestQueue queue;
- Server(RequestQueue queue) {
- this.queue = queue;
- }
- public void run() {
- while(true) {
- Request request = new Request() {
- public void execute() {
- System.out.println("執行客戶請求...XD");
- }
- };
- System.out.printf("\t[Server] Request inqueue...\n");
- queue.put(request);
- // 暫停隨機時間
- try {
- Thread.sleep((int) (Math.random() * 500));
- }
- catch(InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
- package dp.thds.guardedsuspension;
- public class Service implements Runnable {
- private RequestQueue queue;
- private String name;
- Service(RequestQueue queue, String name) {
- this.queue = queue;
- this.name = name;
- }
- public void run() {
- while(true) {
- System.out.printf("\t[%s] Fetch request...\n", name);
- Request req = queue.get();
- System.out.printf("\t[%s] Execute request...\n", name);
- req.execute();
- // 暫停隨機時間
- try {
- Thread.sleep((int) (Math.random() * 1000));
- }
- catch(InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
補充說明 :
* [ Java設計模式 ] 多線程設計模式 : Guarded Suspension Pattern (要等到我準備好喔)
沒有留言:
張貼留言