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

資訊專欄INFORMATION COLUMN

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

golden_hamster / 3333人閱讀

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

一、定義

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

二、模式案例

下面的案例是一種簡單的消息處理模型,客戶端線程發(fā)起請求,有請求隊列緩存請求,然后發(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 + " ]";
    }
}

客戶端線程類:

//客戶端線程不斷生成請求,插入請求隊列
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ù)端線程類:

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

執(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 參與者是一個擁有被防衛(wèi)的方法(guardedMethod)的類。當(dāng)線程執(zhí)行g(shù)uardedMethod時,只要滿足警戒條件,就能繼續(xù)執(zhí)行,否則線程會進(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)多個線程被喚醒時,由于wait是繼續(xù)向下執(zhí)行的,可能會出現(xiàn)問題。

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

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

相關(guān)文章

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

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

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

    摘要:初始時,為,當(dāng)調(diào)用方法時,線程的加,當(dāng)調(diào)用方法時,如果為,則調(diào)用線程進(jìn)入阻塞狀態(tài)。該對象一般供監(jiān)視診斷工具確定線程受阻塞的原因時使用。 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í)行對象的方法時,當(dāng)前線程會立即釋放鎖,并進(jìn)入對象的等待區(qū),等待其它線程喚醒或中斷。 showImg(https://segmentfault.com/img/remote/1460000016012601); 本文首發(fā)于一世流云的專欄:https://segmentfault.com/blog... 本系列文章中所說的juc-...

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

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

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

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

    J4ck_Chan 評論0 收藏0

發(fā)表評論

0條評論

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