`

Design Pattern: Two-phase Termination 模式

    博客分类:
  • J2SE
阅读更多

Two-phase Termination直译的话是“两相终止”,不过就这个模式而言,该译作“两阶段终止”比较适当,想像您有一个执行绪正在周期性的运作,在“运作阶段”您送出了停止执行绪的请求,这时候执行绪不该慌张的马上终止目前的工作,而是先完成这一次周期的工作,然后进入“善后阶段”完成一些善后的工作,例如关闭档案或网路串流,所谓的两阶段终止,即中止“运作阶段”,并完成“善后阶段”,完整的完成执行绪的工作。

以Java的Thread终止而言,不建议您直接使用stop()方法来终止执行绪,stop()方法会丢出ThreadDeath例外强迫执行绪终止,即使执行绪正在运作阶段或执行至synchronized区,如果您要终止执行绪,建议自行实作,例如:

  public class SomeThread extends Thread {
    private boolean isTerminated = false;

    public void terminate() {
        isTerminated = true;
    }

    public void run() {
        while(!isTerminated) {
            // ... some statements
        }
    }
 }

 
考虑到有时执行绪可能会执行至sleep()或wait()而进入Not Runnable状态,使用上面的方法可能会延迟终止的请求,因而可以在要求终止时再呼叫interrupt()方法,这会丢出 InterruptedException,而使得执行绪从Not Runnable状态中离开,因此可以改变一下程式:

 public class SomeThread extends Thread {
    private boolean isTerminated = false;

    public void terminate() {
        isTerminated = true;
        interrupt();
    }

    public void run() {
        try {
            while(!isTerminated) {
                // ... some statements
            }
        }
        catch(InterruptedException e) {
        }
    }
 }

 
在发出中止请求之后,如果执行绪是在Not Runnable状态,会丢出InterruptedException,如果这个例外没有先被捕捉,就会被run()中的catch InterruptedException捕捉,也就是说会直接离开while回圈,因而如果您在发出终止请求后,要求先执行完这一个周期的工作,您要先捕捉这个例外,若不用完成这一个周期的工作,则不用捕捉这个例外,要如何作取决于您的程式。

如果执行绪要完成这一个周期的工作,在下一个周期开始之前检查旗标,这时它的结果是false,所以离开while回圈,这时候您可以进行一些善后工作,这个可以写在finally区块中,例如:

 public class SomeThread extends Thread {
    private boolean isContinue = false;

    public void terminate() {
        isTerminated = true;
        interrupt();
    }

    private void doWorkBeforeShutdown() {
        // .... do some work before shutdown
    }

    public void run() {
        try {
            while(!_isTerminated) {
                // ... some statements
            }
        }
        catch(InterruptedException e) {
        }
        finally {
            doWorkBeforeShutdown();
        }
    }
 }

 
上面这个程式大致上就是Two-phase Termination模式的架构,另外如果您的执行绪还服务着其它的物件,则在送出终止请求到完全终止之前,应该停止服务其它物件,您可以让其它物件要求服务之前,先查询执行绪是否已被要求终止,这可以藉由提供一个方法来达到:

 public class SomeThread extends Thread {
    private boolean isTerminated = false;

    public void terminate() {
        isTerminated = true;
        interrupt();
    }

    public boolean isTerminated() {
        return _isTerminated;
    }

    private void doWorkBeforeShutdown() {
        // .... do some work before shutdown
    }

    public void run() {
        try {
            while(!_isTerminated) {
                // ... some statements
            }
        }
        catch(InterruptedException e) {
        }
        finally {
            doWorkBeforeShutdown();
        }
    }
 }

 

分享到:
评论

相关推荐

    设计模式之-两阶段终止模式(Two-Phase Termination Patter)模式.docx

    两阶段终止模式(Two-Phase Termination Pattern)是一种在多线程编程中确保线程安全关闭的方法,由黄文海在其著作《Java多线程编程实战指南 设计模式》中提出,不属于传统的23种设计模式,而是扩展到36种设计模式之...

    物业管理英语(第二版)参考答案-A25-9298.pdf

    - termination:终止 - lessor:出租方 - breach:违反 - conclude:达成 - relevant:相关的 - dissolution:解散 - consultation:咨询 #### U2L1 - 办理手续与费用 - **基础词汇**: - fill sth in:...

    ecs-spot-termination:Boltopsproecs-spot-termination的公开文档

    ecs-spot-termination配置集 此配置集安装了一个现场终止脚本,该脚本将连续运行并监视现场两分钟警告。 看到两分钟的警告后,它将从ECS群集中耗尽实例。什么是lono配置集? Lono配置集允许通常嵌入在模板中的 可...

    Micron Technical Note:TN-41-02 DDR3 ZQ Calibration Introduction

    - 调整ODT(On-Die Termination,片上终端)电阻,确保数据在传输过程中保持完整。 - 在系统启动、内存速度改变或电压调整后恢复正确的阻抗设置。 2. **ZQ校准的过程**: - 系统初始化:在系统上电或内存初始化...

    JavaConcurrencyPattern:Java并发模式

    Two-phase Termination模式: 【前言】 随着现代CPU的生产Craft.io从提升CPU主频频率转向多核化,即在一块芯片上集成多个CPU内核(Core),以往那种靠CPU自身处理能力的提升所带来的软件计算性能提升的那种“免费...

    k8s-node-termination-handler:GoogleCloudPlatformk8s-node-termination-handler的Helm图表

    目的 应用程序是一种确保可抢占节点在将要被抢占以便Kubernetes更新其管理时接收信号的方法。 没有节点就迷路了,Kubernetes需要一段时间才能意识到它已经消失并更新了管理。 同时,请求可以继续发送到不再存在的Pod...

    DDR3 design guide

    通过阅读Micron的“Hardware Tips for Point-to-Point System Design Termination, Layout.pdf”文件,硬件设计者可以深入了解DDR3内存系统的设计要点,从而创建高效、可靠的DDR3内存解决方案。这份文档将帮助他们...

    multi-objective two-echelon Vehicle Routing多目标二级车辆路径问题的协同进化算法求解

    当这个问题扩展到多目标并且包含两个级别的配送中心(一级和二级)时,就形成了多目标二级车辆路径问题(Multi-objective Two-Echelon Vehicle Routing Problem, MTE-VRP)。这种问题通常更复杂,需要考虑更多的因素...

    reflex-aws-ec2-instance-termination-protection-disabled:确定是否已为EC2实例禁用终止保护的规则

    - ec2-instance-termination-protection-disabled: version: latest 或直接将其添加到您的Terraform中: module "ec2-instance-termination-protection-disabled" { source = "git::...

    CPHY_layout_guide_v1.00_180228.pdf

    10. 走线模式(Pattern Design):C-PHY走线设计支持多种模式,例如单独的走线模式(2-EAMerged)和合并走线模式(3Merged),这取决于走线的宽度和布局的复杂性。 在进行C-PHY走线布局时,需要综合考虑上述因素。...

    aws-node-termination-handler:轻松处理Kubernetes中的EC2实例关闭

    AWS节点终止处理程序 ... aws-node-termination-handler(NTH)可以两种不同模式运行:实例元数据服务(IMDS)或队列处理器。 aws-node-termination-handler 监视器将在每个主机上运行一个小型Pod,以执行对IMD

    x264模式选择论文:Fast Adaptive Early Termination for Mode Selection in H.264AVC Standard Based on x264 Implementation

    本文主要探讨了一种基于x264实现的快速自适应模式选择方法——Fast Adaptive Early Termination for Mode Selection in H.264/AVC Standard (FAET)。FAET的目标是通过减少计算复杂度来加速模式选择过程,同时保持...

    DDR3L 芯片手册

    - **动态和名义的On-Die Termination (ODT)**:用于数据、选通和掩码信号的终端电阻控制。 - **可编程CAS读取延迟(CL)**:允许调整读取操作的延迟时间。 - **可编程CAS写入延迟(CWL)**:支持调整写入操作的延迟...

    Java多线程详解

    Java多线程模式详解 ...10、Two-Phase Termination ———— 快把玩具收拾好,去睡觉吧 11、Thread-Specific Storage ———— 每个线程的保管箱 12、Active Object ———— 接受异步消息的主动对象

    良葛格DesignPattern学习笔记

    - **Two-phase Termination**(两阶段终止模式):允许一个进程安全地终止,即使它拥有多个子线程。 - **Read-Write Lock**(读写锁模式):允许多个读取线程同时访问资源,但只允许一个写入线程访问资源。 - **...

    java多线程设计模式 (PDF中文版, 附源码)

    第10章 Two-Phase Termination——快把玩具收拾好,去睡觉吧 第11章 Thread-Specific Storage——每个线程的保管箱 第12章 Active Object——接受异步消息的主动对象 总结 多线程程序设计的模式语言 附录A 练习问题...

    Board Design Guide for Mobile-set using Samsung eMMC 4.4x to 5.0-02(1).rar

    3. **匹配电阻(Termination Resistors)**: - 匹配电阻用于抑制反射,保持信号质量,特别是在高速数据传输中至关重要。 - 设计时需根据eMMC接口标准和信号速率计算并设置合适的匹配电阻值。 4. **读取速度**: ...

    kube-spot-termination-notice-handler:Kubernetes DaemonSet可以在EC2竞价型实例终止前2分钟正常删除Pod

    $ helm install stable/k8s-spot-termination-handler 可用的Docker图像/标签 标签表示Kubernetes / kubectl版本。 建议对Kubernetes集群和Spot-termination-notice-handler使用相同的版本。 请注意, -1 (或类似...

    xilinx 7系列FPGA应用指南

    ### Xilinx 7系列FPGA应用指南核心知识点详解 #### 一、概述 Xilinx 7系列FPGA是Xilinx公司推出的新一代可编程逻辑器件,该系列包括Artix-7、Kintex-7以及Virtex-7三个家族,针对不同的应用场景进行了优化设计。...

    vlmcsd-1113-2020-03-28-Hotbird64.7z

    Bugfix: Posix versions of vlmcsd were unable to read MS-DOS/Windows text files with crlf line termination Bugfix: the NO_INI_FILE CFLAG did not work in combination with some other directives New CFLAG...

Global site tag (gtag.js) - Google Analytics