线程基础(三十二)

本文作者:王一飞,叩丁狼高级讲师。原创文章,转载请注明出处。

接上篇,本篇讲解线程另外一个设计模式: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>通过抛出异常的方式,告知调用者.

猜你喜欢

转载自blog.csdn.net/wolfcode_cn/article/details/100522588