摘要:會要求線程等候,以保障實例的安全性,其它類似的稱呼還有等。警戒條件是否成立隨著的狀態而變化。注意需要使用,這樣可以使從被喚醒的線程在繼續向下執行前檢查條件。
一、定義
guarded是“被保護著的”、“被防衛著的”意思,suspension則是“暫停”的意思。當現在并不適合馬上執行某個操作時,就要求想要執行該操作的線程等待,這就是Guarded Suspension Pattern。
Guarded Suspension Pattern 會要求線程等候,以保障實例的安全性,其它類似的稱呼還有guarded wait、spin lock等。
下面的案例是一種簡單的消息處理模型,客戶端線程發起請求,有請求隊列緩存請求,然后發送給服務端線程進行處理。
Request類:
//request類表示請求 public class Request { private final String name; public Request(String name) { this.name = name; } public String getName() { return name; } public String toString() { return "[ Request " + name + " ]"; } }
客戶端線程類:
//客戶端線程不斷生成請求,插入請求隊列 public class ClientThread extends Thread { private Random random; private RequestQueue requestQueue; public ClientThread(RequestQueue requestQueue, String name, long seed) { super(name); this.requestQueue = requestQueue; this.random = new Random(seed); } public void run() { for (int i = 0; i < 10000; i++) { Request request = new Request("No." + i); System.out.println(Thread.currentThread().getName() + " requests " + request); requestQueue.putRequest(request); try { Thread.sleep(random.nextInt(1000)); } catch (InterruptedException e) { } } } }
服務端線程類:
//客戶端線程不斷從請求隊列中獲取請求,然后處理請求 public class ServerThread extends Thread { private Random random; private RequestQueue requestQueue; public ServerThread(RequestQueue requestQueue, String name, long seed) { super(name); this.requestQueue = requestQueue; this.random = new Random(seed); } public void run() { for (int i = 0; i < 10000; i++) { Request request = requestQueue.getRequest(); System.out.println(Thread.currentThread().getName() + " handles " + request); try { Thread.sleep(random.nextInt(1000)); } catch (InterruptedException e) { } } } }
請求隊列類:
public class RequestQueue { private final LinkedListqueue = new 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(); } }
注:getRequest方法中有一個判斷while (queue.size() <= 0),該判斷稱為Guarded Suspension Pattern 的警戒條件(guard condition)。
執行:
public class Main { public static void main(String[] args) { RequestQueue requestQueue = new RequestQueue(); new ClientThread(requestQueue, "Alice", 3141592L).start(); new ServerThread(requestQueue, "Bobby", 6535897L).start(); } }三、模式講解
角色:
Guarded Suspension Pattern 的角色如下:
GuardedObject (被防衛的對象)參與者
GuardedObject 參與者是一個擁有被防衛的方法(guardedMethod)的類。當線程執行guardedMethod時,只要滿足警戒條件,就能繼續執行,否則線程會進入wait set區等待。警戒條件是否成立隨著GuardedObject的狀態而變化。
GuardedObject 參與者除了guardedMethod外,可能還有用來更改實例狀態的的方法stateChangingMethod。
在Java語言中,是使用while語句和wait方法來實現guardedMethod的;使用notify/notifyAll方法實現stateChangingMethod。如案例中的RequestQueue 類。
注意:Guarded Suspension Pattern 需要使用while,這樣可以使從wait set被喚醒的線程在繼續向下執行前檢查Guard條件。如果改用if,當多個線程被喚醒時,由于wait是繼續向下執行的,可能會出現問題。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71486.html
摘要:二模式案例該案例會保存數據的屬性,之前所保存的屬性都會被覆蓋。當線程執行時,只有滿足警戒條件時,才會繼續執行,否則會立即返回。警戒條件的成立與否,會隨著參與者的狀態而變化。注上述示例中,類就是被警戒的對象參與者,方法是,方法是。 一、定義 Balking是退縮不前的意思。Balking Pattern和Guarded Suspension Pattern 一樣需要警戒條件。在Balk...
摘要:初始時,為,當調用方法時,線程的加,當調用方法時,如果為,則調用線程進入阻塞狀態。該對象一般供監視診斷工具確定線程受阻塞的原因時使用。 showImg(https://segmentfault.com/img/remote/1460000016012503); 本文首發于一世流云的專欄:https://segmentfault.com/blog... 一、LockSupport類簡介...
摘要:二接口簡介可以看做是類的方法的替代品,與配合使用。當線程執行對象的方法時,當前線程會立即釋放鎖,并進入對象的等待區,等待其它線程喚醒或中斷。 showImg(https://segmentfault.com/img/remote/1460000016012601); 本文首發于一世流云的專欄:https://segmentfault.com/blog... 本系列文章中所說的juc-...
多態性 多態性的字典定義是指生物學中的原理,其中生物體或物種可以具有許多不同的形式或階段,這個原則也可以應用于面向對象的編程和像Java語言之類的語言,類的子類可以定義它們自己的唯一行為,但仍然共享父類的一些相同功能。 可以通過對Bicycle類的微小修改來演示多態性,例如,可以將printDescription方法添加到顯示當前存儲在實例中的所有數據的類中。 public void printD...
閱讀 1856·2023-04-25 14:28
閱讀 1892·2021-11-19 09:40
閱讀 2795·2021-11-17 09:33
閱讀 1385·2021-11-02 14:48
閱讀 1710·2019-08-29 16:36
閱讀 3333·2019-08-29 16:09
閱讀 2917·2019-08-29 14:17
閱讀 2378·2019-08-29 14:07