Java多線程TwoPhaseTermination模式

概述

“分兩個(gè)階段終止”的意思是一先執(zhí)行完終止處理再終止線程的模式,通俗的比喻是“先收拾房間再睡覺(jué)”。

線程進(jìn)行正常處理時(shí)的狀態(tài)為“操作中”。要停止該線程,我們會(huì)發(fā)出“終止請(qǐng)求”。這樣,線程就不會(huì)突然終止,而是先開(kāi)始進(jìn)行“打掃工作”。我們稱這種狀態(tài)為“終止處理中”。
從“操作中”變?yōu)椤敖K止處理中”是線程終止的第一個(gè)階段。
在”終止處理中“狀態(tài)下,線程不會(huì)再進(jìn)行正常操作了。它雖然仍然在運(yùn)行,但是只進(jìn)行終止處理。終止處理完成后,就會(huì)真正地終止線程?!苯K止處理中“狀態(tài)結(jié)束是線程終止的第二階段。
先從”操作中“狀態(tài)變?yōu)椤苯K止處理中“狀態(tài),然后再真正地終止線程。這就是Two-Phase Termination模式。

示例程序

- CountupThread  表示進(jìn)行技術(shù)的線程類
- Main   測(cè)試程序行為的類

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{
      //啟動(dòng)線程
      CountupThread t = new CountupThread();
      t.start();
      //稍微間隔一段時(shí)間
      Thread.sleep(1000);
      //線程的終止請(qǐng)求
      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(終止請(qǐng)求發(fā)出者)
  • Terminator (終止者)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。