線程基礎(三十二)

本文作者:王一飛,叩丁狼高級講師。原創文章,轉載請註明出處。

接上篇,本篇講解線程另外一個設計模式:Balking Pattern.

概念

Balking 是停止並返回意思. 如果當前線程不適合(不滿足守護條件)執行某個操作直接返回,這就是Balking 模式.

Balking 模式跟之前的Guarded Suspension模式有點類似, 區別:
Guarded Suspension模式不滿足守護條件,線程需要掛起等待, 而Balking 模型不滿足守護線程條件直接返回不需要等待

現實生活中的例子:
吃飯中, 想找服務員,大喊一聲,或者招手, 某個服務過來服務, 此時如果其他服務員看到已經有服務過來服務了, 就不用過來.

服務員就是不同線程, 看到已經有人服務表示滿足守護條件, 不用過來,表示不滿足直接退出.

參與角色

Balking 模式參與角色:
GuardedObejct: 被守護對象
被守護對象是一個普通類, 該類擁有2個方法:
方法1:被守護方法, 線程執行該方法前,先檢查是否滿足某種條件(守護條件),如果滿足馬上執行, 如果不滿足,線程退出.
方法2:改變守護條件的方法. 守護條件時可變的, 可根據具體情況調用該方法改變守護條件.

不同線程:
執行守護方法的線程
執行改變守護方法的線程
image.png

模式特徵:

1:存在條件檢查
2:存在不滿足條件時退出

演示案例

需求: 5個服務員, 1個顧客, 看到顧客需要服務,所有服務員都可以過去, 但只有一個可以服務,其他服務員看到有人在服務顧客後,不需要過去了.

//被守護對象
public class Customer {
    //守護條件
    //是否需要服務, 默認不需要
    private volatile boolean serviced = false;

    //改變守護條件
    public synchronized void changeState(boolean serviced){
        this.serviced = serviced; //需要服務
    }

    public synchronized void served(){
        if (!serviced){ //判斷是否滿足服務條件
            System.out.println( Thread.currentThread().getName() + " 服務員看到顧客舉手,過去服務....");
            this.changeState(true);  //服務結束後修改服務條件
        }else{
            System.out.println(Thread.currentThread().getName() + " 服務員看到有其他服務員過去,就忙其它的了....");
        }
    }
}
public class App {

    public static void main(String[] args) {

        final Customer customer = new Customer();

        for (int i = 0; i < 5; i++) {
            final int finalI = i;
            new Thread(new Runnable() {
                public void run() {
                    customer.served();
                }
            }, "waiter_" + i).start();
        }
    }
}
waiter_1 服務員看到顧客舉手,過去服務....
waiter_2 服務員看到有其他服務員過去,就忙其它的了....
waiter_0 服務員看到有其他服務員過去,就忙其它的了....
waiter_4 服務員看到有其他服務員過去,就忙其它的了....
waiter_3 服務員看到有其他服務員過去,就忙其它的了....

一些拓展點

1:何時實用Balking模式
需要判斷執行條件, 並且當不滿足條件直接退出而不需要等待的多線程環境下使用
2:balk返回的結果表示方式
1>忽略balk的結果,即不通知調用者balk的執行情況
2>通過返回值的方式告訴調用者balk的執行請求, 比如: true表示滿足被守護條件並執行了, false反之
3>通過拋出異常的方式,告知調用者.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章