有時候中斷一個正在運行的線程是一個比較重要的應用,但是貌似也是比較困難的事情。假設我們正在用第三方支付軟件進行支付,點擊確定以后,
由於某些原因需要取消這次支付,貌似現在還沒有哪家的支付軟件能夠實現這樣的功能,因為這個實在太困難了。開啟一個線程去進行支付功能后,
即使做了一個這樣的中斷這個線程的功能,這個功能也不能保證錢在沒有支付的前提下,線程被扼殺。
因為在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 }
如果對中斷請求的處理不是線程中斷自己,那么線程將會一直運行下去。
