美文网首页
线程基础(三十二)

线程基础(三十二)

作者: 叩丁狼教育 | 来源:发表于2019-09-16 10:07 被阅读0次

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

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

相关文章

  • 线程基础(三十二)

    本文作者:王一飞,叩丁狼高级讲师。原创文章,转载请注明出处。 接上篇,本篇讲解线程另外一个设计模式:Balking...

  • Java基础

    Java基础 集合基础 集合框架 多线程基础 多线程框架 反射 代理 集合基础 ArrayList LinkedL...

  • Java-并发编程知识点总结

    目录: 线程基础 线程池 各种各样的锁 并发容器 原子类 Java 内存模型 线程协作 AQS 框架 一、线程基础...

  • 年薪50W阿里P7架构师必备知识:并发+JVM+多线程+Nett

    并发编程 线程基础、线程之间的共享和协作一 线程基础、线程之间的共享和协作二 线程的并发工具类 线程的并发工具类、...

  • Java多线程总结 之 基础概念

    基础概念 序言 线程知识结构图 线程基础 什么是线程: 线程和进程的区别: 什么是同步: 并发和并行的区别: 什么...

  • 线程-线程基础

    创建线程 new Thread(?).start() ?可以是2种。 runable接口的实现类 也可以继承Thr...

  • Android中的多线程

    1. Java多线程基础 Java多线程,线程同步,线程通讯 2. Android常用线程 HandlerThre...

  • 多线程方法

    一. 基础并行多线程结构 二. 标准多线程方法,控制并发线程数,带线程锁

  • 线程池

    线程池种类 ThreadPoolExecutor 基础线程池 线程执行任务过程 当前执行线程数 < corePoo...

  • NSThread三种创建线程的方法

    对耗时操作的理解 NSThread基础 线程控制 线程安全 线程间同行

网友评论

      本文标题:线程基础(三十二)

      本文链接:https://www.haomeiwen.com/subject/prapyctx.html