Java多線程基礎(十二)——Two-phase Termination模式

1、定義

咱們將線程的正常處理狀態稱爲「做業中」,當但願結束這個線程時,則送出「終止請求」。接着,這個線程並不會馬上結束,而是進入「終止處理中」狀態,此時線程仍是運行着的,可能處理一些釋放資源等操做。直到終止處理完畢,纔會真正結束。安全

Two-phase Termination主要考慮如下問題:spa

  • 安全地結束(安全性);
  • 必定會進行終止處理(生命性);
  • 收到「終止請求」後,要儘快進行終止處理(響應性);

2、模式案例

該案例中,線程每隔500ms將計數器增長1,在大約10s後結束。線程

計數線程類:code

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 (!shutdownRequested) {
                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);
    }
}

執行:blog

public class Main {
    public static void main(String[] args) {
        System.out.println("main: BEGIN");
        try {
            CountupThread t = new CountupThread();
            t.start();
            Thread.sleep(10000);
            System.out.println("main: shutdownRequest");
            t.shutdownRequest();
            System.out.println("main: join");
            t.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("main: END");
    }
}

3、模式講解

Two-phase Termination模式的角色以下:資源

  • TerminationRequester參與者

TerminationRequester參與者用於調用終止請求。(案例中的Main類)rem

  • Terminator參與者

Terminator參與者接受終止請求,進行實際的終止處理,提供shutdownRequest終止方法供外界調用。
Terminator參與者擁有一個標識(門閂)表示是否已經收到終止請求it

相關文章
相關標籤/搜索