1 虛假的線程中止- Stop
Stop:中止線程,並且清除監控器鎖的信息,但是可能導致線程安全問題,JDK不建議用。
Destroy: JDK未實現該方法
- 理想輸出
i=0 j=0
- 程序執行結果
沒有保證同步代碼塊裏面數據的一致性,破壞了線程安全
2 真正的線程終止
2.1 interrupt
如果目標線程在調用Object class 的
- wait()
- wait(long)
- wait(long, int)
或者Thread類的
- join()
- join(long, int)
- sleep(long, int)
時被阻塞,那麼Interrupt會生效, 該線程的中斷狀態將被清除,拋InterruptedException
如果目標線程是被I/O或者NIO中的Channel所阻塞,同樣,I/O操作會被中斷或者返回特殊異常值。達到終止線程的目的。
如果以上條件都不滿足,則會設置此線程的中斷狀態。
對於上面的示例
- stop改成interrupt
- 最終輸出爲“i=1 j=1”,數據一致
2.2 標誌位
- 即代碼中,增加一個判斷,來控制線程執行的中止