您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關java中斷和終止線程的方法,文章內容質量較高,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
中斷線程
線程中斷僅僅是置線程的中斷狀態位,并不會停止線程。支持線程中斷的方法也就是線程中斷后會拋出interruptedException的方法)就是在監視線程的中斷狀態,比如sleep、join等,一旦線程的中斷狀態被置為“中斷狀態”,就會拋出中斷異常,并且將中斷標志重新置為false。所以在Java中設置線程的中斷狀態位并不會產生對線程運行的實際影響,而是通過監視線程的狀態位并做相應處理,或者通過拋出中斷異常(InterruptedException)來通知用戶進行處理。
終止線程
當調用線程的start方法之后,線程會開始驅動任務,當任務執行完畢之后(也就是run方法執行結束)線程將終止,但是如果因為線程阻塞或者線程長時間執行而不能結束,所以我們希望能夠通過某種途徑可以終止線程以達到想要的效果,常用的方式有兩種:中斷、檢查中斷。
1、interrupt()
、isInterrupted()
、interrupted()
的作用
中斷就是線程的一個標識位,它表示一個運行中的線程是否被其他線程調用了中斷操作,其他線程可以通過調用線程的interrupt()
方法對其進行中斷操作,線程可以通過調用isInterrupted()
方法判斷是否被中斷,線程也可以通過調用Thread
的interrupted()
靜態方法對當前線程的中斷標識位進行復位。
注意:不要認為調用了線程的interrupt()方法,該線程就會停止,它只是做了一個標志位。
如下:
public class InterruptThread extends Thread{ @Override public void run() { //一個死循環 while (true){ System.out.println("InterruptThread正在執行"); } } } public static void main(String[] args) throws InterruptedException { InterruptThread interruptThread = new InterruptThread(); interruptThread.start(); interruptThread.interrupt();//調用線程的interrupt() System.out.println("interruptThread是否被中斷,interrupt = " + interruptThread.isInterrupted()); //此時isInterrupted()方法返回true } 輸出結果: interruptThread是否被中斷,interrupt = true InterruptThread正在執行 InterruptThread正在執行 InterruptThread正在執行 //...
可以看到當你調用了線程的interrupt()方法后,此時調用isInterrupted()方法會返回true,但是該線程還是會繼續執行下去。所以怎么樣才能終止一個線程的運行呢?
2、終止線程的運行
一個線程正常執行完run方法之后會自動結束,如果在運行過程中發生異常也會提前結束;所以利用這兩種情況,我們還可以通過以下三種種方式安全的終止運行中的線程:
2.1、利用中斷標志位
前面講到的中斷操作就可以用來取消線程任務,如下:
public class InterruptThread extends Thread{ @Override public void run() { while (!isInterrupted()){//利用中斷標記位 System.out.println("InterruptThread正在執行"); } } }
當不需要運行InterruptThread線程時,通過調用InterruptThread.interrupt()使得isInterrupted()返回true,就可以讓線程退出循環,正常執行完畢之后自動結束。
2.2、利用一個boolean變量
利用一個boolean變量和上述方法同理,如下:
public class InterruptThread extends Thread{ private volatile boolean isCancel; @Override public void run() { while (!isCancel){//利用boolean變量 System.out.println("InterruptThread正在執行"); } } public void cancel(){ isCancel = true; } }
當不需要運行InterruptThread線程時,通過調用InterruptThread.cancel()使isCancel等于true,就可以讓線程退出循環,正常執行完畢之后自動結束,這里要注意boolean變量要用volatile修飾保證內存的可見性。
2.3、響應InterruptedException
通過調用一個線程的 interrupt() 來中斷該線程時,如果該線程處于阻塞、限期等待或者無限期等待狀態,那么就會拋出 InterruptedException,從而提前結束該線程,例如當你調用Thread.sleep()方法時,通常會讓你捕獲一個InterruptedException異常,如下:
public class InterruptThread extends Thread{ @Override public void run() { try{ while (true){ Thread.sleep(100);//Thread.sleep會拋出InterruptedException System.out.println("InterruptThread正在執行"); } }catch (InterruptedException e){ e.printStackTrace(); } } }
當不需要運行InterruptThread線程時,通過調用InterruptThread.interrupt()使得 Thread.sleep() 拋出InterruptedException,就可以讓線程退出循環,提前結束。在拋出InterruptedException異常之前,JVM會把中斷標識位復位,此時調用線程的isInterrupted()方法將會返回false。
以上就是java中斷和終止線程的方法,看完之后是否有所收獲呢?如果想了解更多相關內容,歡迎關注億速云行業資訊,感謝各位的閱讀。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。