咱們將線程的正常處理狀態稱爲「做業中」,當但願結束這個線程時,則送出「終止請求」。接着,這個線程並不會馬上結束,而是進入「終止處理中」狀態,此時線程仍是運行着的,可能處理一些釋放資源等操做。直到終止處理完畢,纔會真正結束。安全
Two-phase Termination主要考慮如下問題:spa
該案例中,線程每隔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"); } }
Two-phase Termination模式的角色以下:資源
TerminationRequester參與者用於調用終止請求。(案例中的Main類)rem
Terminator參與者接受終止請求,進行實際的終止處理,提供shutdownRequest終止方法供外界調用。
Terminator參與者擁有一個標識(門閂)表示是否已經收到終止請求it