Java多线程TwoPhaseTermination模式

概述

“分两个阶段终止”的意思是一先执行完终止处理再终止线程的模式,通俗的比喻是“先收拾房间再睡觉”。

线程进行正常处理时的状态为“操作中”。要停止该线程,我们会发出“终止请求”。这样,线程就不会突然终止,而是先开始进行“打扫工作”。我们称这种状态为“终止处理中”。
从“操作中”变为“终止处理中”是线程终止的第一个阶段。
在”终止处理中“状态下,线程不会再进行正常操作了。它虽然仍然在运行,但是只进行终止处理。终止处理完成后,就会真正地终止线程。”终止处理中“状态结束是线程终止的第二阶段。
先从”操作中“状态变为”终止处理中“状态,然后再真正地终止线程。这就是Two-Phase Termination模式。

示例程序

- CountupThread  表示进行技术的线程类
- Main   测试程序行为的类

CountupThread 类

public class CountupThread extends Thread {
  private long counter = 0;
  private volatile boolean shutdownRequested = false;
  
  public void shutdownRequest() {
    shutdownRequested = true;
    interrupt();
  }

  public boolean isShutdownRequested(){
    return shutdownRequested;
  }

  public final void run() {
    try{
      while(!isShutdownRequested()){
        doWork();
      }
    } catch (InterruptedException e){
    } finally { doShutdown();}
  }
  
  private void doWork() throws InterruptedException {
    counter++;
    System.out.println("doWork: counter = " + counter);
    Thread.sleep(500);
  }
  
  private void doShutdown(){
    System.out.println("doShutdown: counter = " + counter);
  }
}

Main 类

public class Main {
  public static void main(String[]  args){
    System.out.println("main:  BEGIN");
    try{
      //启动线程
      CountupThread t = new CountupThread();
      t.start();
      //稍微间隔一段时间
      Thread.sleep(1000);
      //线程的终止请求
      System.out.println("main:  shutdownRequest");
      t.shutDownRequest();

      System.out.println("main: shutdownRequest");
      System.out.println("main:  join");
      //等待线程终止
      t.join();
    } catch(InterruptedException e){
      e.printStackTrace();
    };
    System.out.println("main: END");
  }
}

Two Phase Termination 模式的角色

  • TerminationRequester(终止请求发出者)
  • Terminator (终止者)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。