成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

golden_hamster / 3335人閱讀

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

一、定義

guarded是“被保護(hù)著的”、“被防衛(wèi)著的”意思,suspension則是“暫?!钡囊馑?。當(dāng)現(xiàn)在并不適合馬上執(zhí)行某個(gè)操作時(shí),就要求想要執(zhí)行該操作的線程等待,這就是Guarded Suspension Pattern。
Guarded Suspension Pattern 會(huì)要求線程等候,以保障實(shí)例的安全性,其它類似的稱呼還有g(shù)uarded wait、spin lock等。

二、模式案例

下面的案例是一種簡單的消息處理模型,客戶端線程發(fā)起請求,有請求隊(duì)列緩存請求,然后發(fā)送給服務(wù)端線程進(jìn)行處理。

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 + " ]";
    }
}

客戶端線程類:

//客戶端線程不斷生成請求,插入請求隊(duì)列
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) {
            }
        }
    }
}

服務(wù)端線程類:

//客戶端線程不斷從請求隊(duì)列中獲取請求,然后處理請求
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) {
            }
        }
    }
}

請求隊(duì)列類:

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方法中有一個(gè)判斷while (queue.size() <= 0),該判斷稱為Guarded Suspension Pattern 的警戒條件(guard condition)。

執(zhí)行:

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 (被防衛(wèi)的對象)參與者

GuardedObject 參與者是一個(gè)擁有被防衛(wèi)的方法(guardedMethod)的類。當(dāng)線程執(zhí)行g(shù)uardedMethod時(shí),只要滿足警戒條件,就能繼續(xù)執(zhí)行,否則線程會(huì)進(jìn)入wait set區(qū)等待。警戒條件是否成立隨著GuardedObject的狀態(tài)而變化。
GuardedObject 參與者除了guardedMethod外,可能還有用來更改實(shí)例狀態(tài)的的方法stateChangingMethod。

在Java語言中,是使用while語句和wait方法來實(shí)現(xiàn)guardedMethod的;使用notify/notifyAll方法實(shí)現(xiàn)stateChangingMethod。如案例中的RequestQueue 類。

注意:Guarded Suspension Pattern 需要使用while,這樣可以使從wait set被喚醒的線程在繼續(xù)向下執(zhí)行前檢查Guard條件。如果改用if,當(dāng)多個(gè)線程被喚醒時(shí),由于wait是繼續(xù)向下執(zhí)行的,可能會(huì)出現(xiàn)問題。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71486.html

相關(guān)文章

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

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

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

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

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

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

    dkzwm 評論0 收藏0
  • 并發(fā)基礎(chǔ)

    摘要:關(guān)于,這個(gè)方法只會(huì)喚醒一個(gè)線程,并且不允許指定喚醒哪個(gè)線程,這是可能會(huì)發(fā)生死鎖的。使用不可變對象降低了垃圾回收所產(chǎn)生的額外開銷,同時(shí)也可以減少一些為了維護(hù)在并發(fā)中的的代碼開銷。 前言 跟著 The Java Tutorials 把并發(fā)的一些基礎(chǔ)過了一遍,發(fā)現(xiàn)仍然還是有很多不清楚的地方,主要是因?yàn)槠匠]有機(jī)會(huì)實(shí)際應(yīng)用吧,理論知識要有,實(shí)踐也很重要,哪怕是寫些小 demo 也可以的。 雖然...

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

    多態(tài)性 多態(tài)性的字典定義是指生物學(xué)中的原理,其中生物體或物種可以具有許多不同的形式或階段,這個(gè)原則也可以應(yīng)用于面向?qū)ο蟮木幊毯拖馢ava語言之類的語言,類的子類可以定義它們自己的唯一行為,但仍然共享父類的一些相同功能。 可以通過對Bicycle類的微小修改來演示多態(tài)性,例如,可以將printDescription方法添加到顯示當(dāng)前存儲(chǔ)在實(shí)例中的所有數(shù)據(jù)的類中。 public void printD...

    J4ck_Chan 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<