Java多線程設計模式(6)兩階段終止模式

一 Two-Phase Termination Patternjava

  Two-Phase Termination Pattern,指的就是當但願結束一個線程的時候,送出一個終止請求,可是不會立刻中止,作一些刷新工做。進入「終止處理中」,在該狀態下,不會進行該線程平常工做任務的操做,而是進行一些終止操做。安全

   這個方式所考慮的因素以下架構

  1,必需要考慮到使得該線程可以安全的結束,Thread中的stop會有問題的,由於它會無論線程執行到哪裏,都會立刻中止,不能保證安全的結束。ide

  2,必定可以進行正常的終止處理,在java中,這點可使用finally來實現spa

  3,可以高響應的終止,收到終止後,當線程在wait或者sleep或者join的時候,不用等到時間到才終止,而是立刻中斷線程的這些狀態,進而進行終止操做。線程

   當一個線程正在執行週期性的工做時候,在「做業中」發了中止執行緒的請求,此時該線程不能立刻離開中止,而應該先作完本次週期內部的工做,而後進入「善後階段」完成一些善後的工做,所謂的兩階段終止,即停止「運做階段」,並完成「善後階段」,完整的完成執行緒的工做。內存

兩階段終止線程的架構模式以下:同步

public class WorkerTerminalThread extends Thread {
       // 已經送出終止請求爲true,初始化的時候爲false
       //因爲該字段可能會被多個線程訪問修改,爲了保護就使用這個
    private volatile boolean shutdownRequested = false;
    // 終止請求
    public void shutdownRequest() {
        shutdownRequested = true;
        interrupt();
    }
    public boolean isShutdownRequest() {
        return shutdownRequested;
    }
    // 具體動做
    public final void run() {
        try {
            while (!shutdownRequested)
                doWork();
        } catch (InterruptedException e) {
        }
        // 終止處理中的工做,不會進行日常操做,可是會進行終止處理
        finally {
            doShutdown();
        }
    }
    // 具體工做操做
    private void doWork() throws InterruptedException {
    }
    // 終止後進行善後處理
    private void doShutdown() 
    {
    }
}

解釋:it

  1,利用Volatile的緣由是,這個字段可能會被多個線程所使用,進行修改,爲了保護該字段,則能夠利用同步方法或者同步代碼塊來保護,或者利用Volatile。用Volatile修飾的字段,強制了該成員變量在每次被線程訪問時,都強迫從共享內存中重讀該成員變量的值。並且,當成員變量發生變化時,強迫線程將變化值回寫到共享內存。這樣在任什麼時候刻,兩個不一樣的線程老是看到某個成員變量的同一個值。io

  2,這裏運用了標識和中斷狀態來終止線程,之因此不單獨用一個。緣由是若是僅僅利用標識,沒法是的那些處於wait、sleep或者join中的線程立刻中止,響應性就會不好。加入了interrupt後,就能夠馬上使得這些狀態下的線程中斷。若是僅僅利用interrupt,因爲interrupt僅僅對於wait,sleep或join處進行拋出異常,若是工做代碼執行在catch裏,捕獲了InterruptedException後,則此時interrupt就不起做用了。

相關文章
相關標籤/搜索