首页 > 技术文章 > 朝花夕拾系列文章 >

线程基础(三十二)

更新时间:2019-09-03 | 阅读量(1,021)

>本文作者:王一飞,叩丁狼高级讲师。原创文章,转载请注明出处。 接上篇,本篇讲解线程另外一个设计模式:Balking Pattern. #### 概念 Balking 是停止并返回意思. 如果当前线程不适合(不满足守护条件)执行某个操作直接返回,这就是Balking 模式. Balking 模式跟之前的Guarded Suspension模式有点类似, 区别: Guarded Suspension模式不满足守护条件,线程需要挂起等待, 而Balking 模型不满足守护线程条件直接返回不需要等待 现实生活中的例子: 吃饭中, 想找服务员,大喊一声,或者招手, 某个服务过来服务, 此时如果其他服务员看到已经有服务过来服务了, 就不用过来. 服务员就是不同线程, 看到已经有人服务表示满足守护条件, 不用过来,表示不满足直接退出. #### 参与角色 Balking 模式参与角色: GuardedObejct: 被守护对象 被守护对象是一个普通类, 该类拥有2个方法: 方法1:被守护方法, 线程执行该方法前,先检查是否满足某种条件(守护条件),如果满足马上执行, 如果不满足,线程退出. 方法2:改变守护条件的方法. 守护条件时可变的, 可根据具体情况调用该方法改变守护条件. 不同线程: 执行守护方法的线程 执行改变守护方法的线程 ![](http://www.wolfcode.cn/data/upload/20190903//5d6e1d9615375.png) #### 模式特征: 1:存在条件检查 2:存在不满足条件时退出 #### 演示案例 需求: 5个服务员, 1个顾客, 看到顾客需要服务,所有服务员都可以过去, 但只有一个可以服务,其他服务员看到有人在服务顾客后,不需要过去了. ```java //被守护对象 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() + " 服务员看到有其他服务员过去,就忙其它的了...."); } } } ``` ```java 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(); } } } ``` ```java waiter_1 服务员看到顾客举手,过去服务.... waiter_2 服务员看到有其他服务员过去,就忙其它的了.... waiter_0 服务员看到有其他服务员过去,就忙其它的了.... waiter_4 服务员看到有其他服务员过去,就忙其它的了.... waiter_3 服务员看到有其他服务员过去,就忙其它的了.... ``` #### 一些拓展点 1:何时实用Balking模式 需要判断执行条件, 并且当不满足条件直接退出而不需要等待的多线程环境下使用 2:balk返回的结果表示方式 1>忽略balk的结果,即不通知调用者balk的执行情况 2>通过返回值的方式告诉调用者balk的执行请求, 比如: true表示满足被守护条件并执行了, false反之 3>通过抛出异常的方式,告知调用者.
叩丁狼学员采访 叩丁狼学员采访
叩丁狼头条 叩丁狼头条
叩丁狼在线课程 叩丁狼在线课程