java線程中的interrupt,isInterrupt,interrupted方法

來源:互聯網
上載者:User

標籤:java

在java的線程Thread類中有三個方法,比較容易混淆,在這裡解釋一下
(1)interrupt:置線程的中斷狀態
(2)isInterrupt:線程是否中斷

(3)interrupted:返回線程的上次的中斷狀態,並清除中斷狀態

舉個例子:

[java] view plaincopy
  1. 用法:  
  2. class MyThread extends Thread {  
  3.     ......  
  4.     ......  
  5.     public void run() {  
  6.         try {  
  7.             while(!Thread.currentThread().isInterrupted()) {  
  8.                 //當達到隊列容量時,在這裡會阻塞  
  9.                 //put的內部會調用LockSupport.park()這個是用來阻塞線程的方法  
  10.                 //當其他線程,調用此線程的interrupt()方法時,會設定一個中斷標誌  
  11.                 //LockSupport.part()中檢測到這個中斷標誌,會拋出InterruptedException,並清除線程的中斷標誌  
  12.                 //因此在異常段調用Thread.currentThread().isInterrupted()返回為false  
  13.                 ArrayBlockingQueue.put(somevalue);   
  14.             }  
  15.         } catch (InterruptedException e) {  
  16.             //由於阻塞庫函數,如:Object.wait,Thread.sleep除了拋出異常外,還會清除線程中斷狀態,因此可能在這裡要保留線程的中斷狀態  
  17.             Thread.currentThread().interrupt();  
  18.         }  
  19.     }  
  20.     public void cancel() {  
  21.         interrupt();  
  22.     }  
  23. }  
  24. 外部調用  
  25. MyThread thread = new MyThread();  
  26. thread.start();  
  27. ......  
  28. thread.cancel();  
  29. thread.isInterrupted();  


一般來說,阻塞函數,如:Thread.sleep、Thread.join、Object.wait、LockSupport.park等在檢查到線程的中斷狀態時,會拋出InterruptedException,同時會清除線程的中斷狀態

對於InterruptedException的處理,可以有兩種情況:
(1)外層代碼可以處理這個異常,直接拋出這個異常即可
(2)如果不能拋出這個異常,比如在run()方法內,因為在得到這個異常的同時,線程的中斷狀態已經被清除了,需要保留線程的中斷狀態,則需要調用Thread.currentThread().interrupt()

另外,Thread.interrupted()在jdk庫的原始碼中比較常用,因為它既可以得到上一次線程的中斷標誌值,又可以同時清除線程的中斷標誌,一舉兩得,但同時也有壞處,就是這個函數有清除中斷狀態的副作用,不容易理解

java線程中的interrupt,isInterrupt,interrupted方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.