一 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就不起做用了。