国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java多線程基礎(五)——Guarded Suspension模式

golden_hamster / 3326人閱讀

摘要:會要求線程等候,以保障實例的安全性,其它類似的稱呼還有等。警戒條件是否成立隨著的狀態而變化。注意需要使用,這樣可以使從被喚醒的線程在繼續向下執行前檢查條件。

一、定義

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 LinkedList queue = 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

相關文章

  • Java線程基礎(六)——Balking模式

    摘要:二模式案例該案例會保存數據的屬性,之前所保存的屬性都會被覆蓋。當線程執行時,只有滿足警戒條件時,才會繼續執行,否則會立即返回。警戒條件的成立與否,會隨著參與者的狀態而變化。注上述示例中,類就是被警戒的對象參與者,方法是,方法是。 一、定義 Balking是退縮不前的意思。Balking Pattern和Guarded Suspension Pattern 一樣需要警戒條件。在Balk...

    Faremax 評論0 收藏0
  • Java線程進階()—— J.U.C之locks框架:LockSupport

    摘要:初始時,為,當調用方法時,線程的加,當調用方法時,如果為,則調用線程進入阻塞狀態。該對象一般供監視診斷工具確定線程受阻塞的原因時使用。 showImg(https://segmentfault.com/img/remote/1460000016012503); 本文首發于一世流云的專欄:https://segmentfault.com/blog... 一、LockSupport類簡介...

    jsyzchen 評論0 收藏0
  • Java線程進階(二)—— J.U.C之locks框架:接口

    摘要:二接口簡介可以看做是類的方法的替代品,與配合使用。當線程執行對象的方法時,當前線程會立即釋放鎖,并進入對象的等待區,等待其它線程喚醒或中斷。 showImg(https://segmentfault.com/img/remote/1460000016012601); 本文首發于一世流云的專欄:https://segmentfault.com/blog... 本系列文章中所說的juc-...

    dkzwm 評論0 收藏0
  • 并發基礎

    摘要:關于,這個方法只會喚醒一個線程,并且不允許指定喚醒哪個線程,這是可能會發生死鎖的。使用不可變對象降低了垃圾回收所產生的額外開銷,同時也可以減少一些為了維護在并發中的的代碼開銷。 前言 跟著 The Java Tutorials 把并發的一些基礎過了一遍,發現仍然還是有很多不清楚的地方,主要是因為平常沒有機會實際應用吧,理論知識要有,實踐也很重要,哪怕是寫些小 demo 也可以的。 雖然...

    Warren 評論0 收藏0
  • Java? 教程(態性)

    多態性 多態性的字典定義是指生物學中的原理,其中生物體或物種可以具有許多不同的形式或階段,這個原則也可以應用于面向對象的編程和像Java語言之類的語言,類的子類可以定義它們自己的唯一行為,但仍然共享父類的一些相同功能。 可以通過對Bicycle類的微小修改來演示多態性,例如,可以將printDescription方法添加到顯示當前存儲在實例中的所有數據的類中。 public void printD...

    J4ck_Chan 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<