日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JUC 中断线程的3种方式

發布時間:2024/9/27 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JUC 中断线程的3种方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 介紹
      • 中斷方式一
      • 中斷方式二
      • 中斷方式三
        • 源碼解析
    • 總結

介紹

三個方法:

1public boolean isInterrupted()

判斷線程是否被中斷,如果此線程已被中斷,則為true ;否則false 。

2public void interrupt()

中斷線程

3public `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();}

??中斷簡要流程圖:

private native void interrupt0();

從上面可以看出interrupt0()方法是一個本地方法,響應中斷是由操作系統調度的。
💡 2、sleep()

public static native void sleep(long millis) throws InterruptedException;

該方法也是一個本地方法,用于在指定時間內,中斷線程。如果任何線程中斷了當前線程,那么就會拋出異常InterruptedException 時清除當前線程的中斷狀態。

💡3、isInterrupted()
如果此線程已被中斷,則為true ;否則false 。

public boolean isInterrupted() {return isInterrupted(false); }

下面本地方法用于根據ClearInterrupted傳入的值判斷是否重置中斷狀態。

private native boolean isInterrupted(boolean ClearInterrupted);

💡4、Thread.interrupted()
判斷當前線程是否被中斷。通過該方法清除線程的中斷狀態。換句話說,如果這個方法被連續調用兩次,那么第二次調用將返回 false(除非當前線程再次被中斷,在第一次調用清除其中斷狀態之后,第二次調用檢查它之前)。如果當前線程已被中斷,則為true ;否則false 。

public static boolean interrupted() {return currentThread().isInterrupted(true);}

?? 案例:

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种方式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。