JUC 中断线程的3种方式
文章目錄
- 介紹
- 中斷方式一
- 中斷方式二
- 中斷方式三
- 源碼解析
- 總結
介紹
三個方法:
1、public boolean isInterrupted()判斷線程是否被中斷,如果此線程已被中斷,則為true ;否則false 。
2、public void interrupt()中斷線程
3、public `static` boolean interrupted()判斷當前線程是否被中斷。通過該方法清除線程的中斷狀態。如果這個方法被連續調用兩次,第二次調用將返回 false(除非當前線程再次被中斷,在第一次調用清除其中斷狀態之后,第二次調用檢查它之前)。如果當前線程已被中斷,則為true ;否則false 。
中斷方式一
通過使用volatile 實現多線程中變量的共享,設置一個標志位變量即可實現線程的中斷。通過在另一個線程中修改變量標志位,當前線程就會自己實現中斷。
中斷方式二
通過一個原子類AtomicBoolean設置標志位實現,思想和方式一大同小異。
中斷方式三
源碼解析
💡 1、interrupt()
public void interrupt() {if (this != Thread.currentThread())checkAccess();synchronized (blockerLock) {Interruptible b = blocker;if (b != null) {interrupt0(); // 只是為了設置中斷標志b.interrupt(this);return;}}interrupt0();}??中斷簡要流程圖:
從上面可以看出interrupt0()方法是一個本地方法,響應中斷是由操作系統調度的。
💡 2、sleep()
該方法也是一個本地方法,用于在指定時間內,中斷線程。如果任何線程中斷了當前線程,那么就會拋出異常InterruptedException 時清除當前線程的中斷狀態。
💡3、isInterrupted()
如果此線程已被中斷,則為true ;否則false 。
下面本地方法用于根據ClearInterrupted傳入的值判斷是否重置中斷狀態。
private native boolean isInterrupted(boolean ClearInterrupted);💡4、Thread.interrupted()
判斷當前線程是否被中斷。通過該方法清除線程的中斷狀態。換句話說,如果這個方法被連續調用兩次,那么第二次調用將返回 false(除非當前線程再次被中斷,在第一次調用清除其中斷狀態之后,第二次調用檢查它之前)。如果當前線程已被中斷,則為true ;否則false 。
?? 案例:
public class Zd4 {public static void main(String[] args) {System.out.println(Thread.currentThread().getName()+" "+Thread.interrupted());System.out.println(Thread.currentThread().getName()+" "+Thread.interrupted());System.out.println("hello");Thread.currentThread().interrupt();System.out.println("world");System.out.println(Thread.currentThread().getName()+" "+Thread.interrupted());System.out.println(Thread.currentThread().getName()+" "+Thread.interrupted());Thread.currentThread().interrupt();System.out.println(Thread.currentThread().getName()+" "+Thread.interrupted());System.out.println(Thread.currentThread().getName()+" "+Thread.interrupted());} }🎨 運行結果:
main false main false hello world main true main false //發現沒有,第二次為false main true main false //也是false?? 注意點: 如果在上面while(true)里面使用sleep(long),由于拋出InterruptedException異常,那么中斷標志位就會被置為false,導致程序一直不退出while(true)循環。
總結
中斷僅僅是修改狀態標志位,不會將線程立即停止。
總結
以上是生活随笔為你收集整理的JUC 中断线程的3种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis数据类型--字符串类型
- 下一篇: 比较 Excel 中两列的差异,并用箭头