如何中斷一個正在運行的線程


有時候中斷一個正在運行的線程是一個比較重要的應用,但是貌似也是比較困難的事情。假設我們正在用第三方支付軟件進行支付,點擊確定以后,

由於某些原因需要取消這次支付,貌似現在還沒有哪家的支付軟件能夠實現這樣的功能,因為這個實在太困難了。開啟一個線程去進行支付功能后,

即使做了一個這樣的中斷這個線程的功能,這個功能也不能保證錢在沒有支付的前提下,線程被扼殺。

 

因為在Java的語言層面上沒有提供有保證性的能夠安全的終止線程的方法。而是采用了一種協商的方式來對線程進行中斷。interrupte()方法就是中斷

線程的方法,通過調用isInterrupted()和interrupted()方法都能來判斷該線程是否被中斷,它們的區別是,isInterrupted會保持中斷狀態;而

interrupted會清除中斷狀態。

 

線程在調用阻塞方法(sleep、join、wait、await)都會去檢測這個中斷狀態,如果該線程已經被中斷那么就會拋出InterruptedException,所以這些中斷

方法都需要處理InterruptedException異常。拋出這個異常的作用是:(1)能夠有時間處理中斷請求;(2)清除中斷狀態

 1 public class MyThread extends Thread{
 2     public static void main(String[] args) {
 3           MyThread t=new MyThread();
 4           t.start();
 5           try {
 6             Thread.sleep(2000);//使開啟的線程能夠跑到執行體,否則線程還沒到達執行體就被中斷,此時判斷中斷狀態肯定為true。
 7                                //那么就不能跑到執行體里面了
 8         } catch (InterruptedException e1) {
 9             e1.printStackTrace();
10         }
11           System.out.println("主線程中斷開啟線程");
12           t.interrupt();//主線程中斷開啟線程
13           System.out.println("等待中斷請求");
14           try {
15             Thread.sleep(3000);//等待開啟線程處理中斷
16         } catch (InterruptedException e) {
17             e.printStackTrace();
18         }
19           System.out.println("應用程序結束");
20         
21     }
22     
23     
24     public void run() {
25         while(!Thread.currentThread().isInterrupted()) {
26                 System.out.println("線程正在運行。。");
27                 for(int i=0;i<100;i++) {
28                     System.out.println("i的值為:"+i);
29                 }
30                 
31                 try {
32                     Thread.sleep(2000);
33                 } catch (InterruptedException e) {
34                     System.out.println("開啟線程被中斷");
35                     Thread.currentThread().interrupt();//對中斷請求的處理就是中斷自己
36                 }
37         }
38     }
39 }

如果對中斷請求的處理不是線程中斷自己,那么線程將會一直運行下去。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM