Stop:停止線程,而且清除監控器鎖的信息,可是可能致使
線程安全問題,JDK不建議用。
Destroy: JDK未實現該方法。java
/** * @author simon */ public class StopThread extends Thread { private int i = 0, j = 0; @Override public void run() { synchronized (this) { // 增長同步鎖,確保線程安全 ++i; try { // 休眠10秒,模擬耗時操做 Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } ++j; } } /** * 打印i和j */ public void print() { System.out.println("i=" + i + " j=" + j); } }
/** * @author simon * 示例3 - 線程stop強制性停止,破壞線程安全的示例 */ public class Demo { public static void main(String[] args) throws InterruptedException { StopThread thread = new StopThread(); thread.start(); // 休眠1秒,確保i變量自增成功 Thread.sleep(1000); // 暫停線程 thread.stop(); // 錯誤的終止 //thread.interrupt(); // @正確終止 while (thread.isAlive()) { // 確保線程已經終止 } // 輸出結果 thread.print(); } }
理想狀態:要麼自增成功i=1, j=1,要麼自增失敗i=0, j=0
真正程序執行結果:i=1, j=0安全
沒有保證同步代碼塊裏面數據的一致性,破壞了線程安全
stop方法直接中止線程多線程
若是目標線程在調用Object class的wait()、wait(long)或wait(long, int)方法、join()、join(long, int)或sleep(long, int)方法時被阻塞,那麼Interrupt會生效,該線程的中斷狀態將被清除,拋出InterruptedException異常。ide
若是目標線程是被I/O或者NIO中的Channel所阻塞,一樣,I/O操做會被中斷或者返回特殊異常值。達到終止線程的目的。this
若是以上條件都不知足,則會設置此線程的中斷狀態。線程
對Demo中的示例,stop()改爲interrupt()後,最終輸出爲"i=1 j=1",數據一致。code
/** 經過狀態位來判斷 */ public class Demo4 extends Thread { public volatile static boolean flag = true; public static void main(String[] args) throws InterruptedException { new Thread(() -> { try { while (flag) { // 判斷是否運行 System.out.println("程序運行中"); Thread.sleep(1000L); } } catch (InterruptedException e) { e.printStackTrace(); } }).start(); // 3秒以後,將狀態標誌改成False,表明不繼續運行 Thread.sleep(3000L); flag = false; System.out.println("程序運行結束"); } }
在上方代碼邏輯中,增長一個判斷,用來控制線程執行的停止。blog