理解Java執行緒的中斷
執行緒中斷三方法
public void Thread.interrupt() // 中斷執行緒
public boolean Thread.isInterrupted() // 判斷是否被中斷
public static boolean Thread.interrupted() // 判斷是否被中斷,並清除當前中斷狀態
轉載自:
http://blog.csdn.net/sunxing007/article/details/9123363
一個執行緒在未正常結束之前, 被強制終止是很危險的事情. 因為它可能帶來完全預料不到的嚴重後果. 所以你看到Thread.suspend, Thread.stop等方法都被Deprecated了.
那麼不能直接把一個執行緒搞掛掉, 但有時候又有必要讓一個執行緒死掉, 或者讓它結束某種等待的狀態 該怎麼辦呢? 優雅的方法就是, 給那個執行緒一箇中斷訊號, 讓它自己決定該怎麼辦. 比如說, 在某個子執行緒中為了等待一些特定條件的到來, 你呼叫了Thread.sleep(10000), 預期執行緒睡10秒之後自己醒來, 但是如果這個特定條件提前到來的話, 你怎麼通知一個在睡覺的執行緒呢? 又比如說, 主執行緒透過呼叫子執行緒的join方法阻塞自己以等待子執行緒結束, 但是子執行緒執行過程中發現自己沒辦法在短時間內結束, 於是它需要想辦法告訴主執行緒別等我了. 這些情況下, 就需要中斷.
中斷是透過呼叫Thread.interrupt()方法來做的. 這個方法透過修改了被呼叫執行緒的中斷狀態來告知那個執行緒, 說它被中斷了. 對於非阻塞中的執行緒, 只是改變了中斷狀態, 即Thread.isInterrupted()將返回true; 對於可取消的阻塞狀態中的執行緒, 比如等待在這些函式上的執行緒, Thread.sleep(), Object.wait(), Thread.join(), 這個執行緒收到中斷訊號後, 會丟擲InterruptedException, 同時會把中斷狀態置回為false.
下面的程式會演示對非阻塞中的執行緒中斷:
下面的程式演示的是子執行緒通知父執行緒別等它了:
中斷狀態可以透過 Thread.isInterrupted()來讀取,並且可以透過一個名為 Thread.interrupted()的靜態方法讀取和清除狀態(即呼叫該方法結束之後, 中斷狀態會變成false)。
由於處於阻塞狀態的執行緒 被中斷後丟擲exception並置回中斷狀態, 有時候是不利的, 因為這個中斷狀態可能會作為別的執行緒的判斷條件, 所以穩妥的辦法是在處理exception的地方把狀態復位:
public void Thread.interrupt() // 中斷執行緒
public boolean Thread.isInterrupted() // 判斷是否被中斷
public static boolean Thread.interrupted() // 判斷是否被中斷,並清除當前中斷狀態
轉載自:
http://blog.csdn.net/sunxing007/article/details/9123363
一個執行緒在未正常結束之前, 被強制終止是很危險的事情. 因為它可能帶來完全預料不到的嚴重後果. 所以你看到Thread.suspend, Thread.stop等方法都被Deprecated了.
那麼不能直接把一個執行緒搞掛掉, 但有時候又有必要讓一個執行緒死掉, 或者讓它結束某種等待的狀態 該怎麼辦呢? 優雅的方法就是, 給那個執行緒一箇中斷訊號, 讓它自己決定該怎麼辦. 比如說, 在某個子執行緒中為了等待一些特定條件的到來, 你呼叫了Thread.sleep(10000), 預期執行緒睡10秒之後自己醒來, 但是如果這個特定條件提前到來的話, 你怎麼通知一個在睡覺的執行緒呢? 又比如說, 主執行緒透過呼叫子執行緒的join方法阻塞自己以等待子執行緒結束, 但是子執行緒執行過程中發現自己沒辦法在短時間內結束, 於是它需要想辦法告訴主執行緒別等我了. 這些情況下, 就需要中斷.
中斷是透過呼叫Thread.interrupt()方法來做的. 這個方法透過修改了被呼叫執行緒的中斷狀態來告知那個執行緒, 說它被中斷了. 對於非阻塞中的執行緒, 只是改變了中斷狀態, 即Thread.isInterrupted()將返回true; 對於可取消的阻塞狀態中的執行緒, 比如等待在這些函式上的執行緒, Thread.sleep(), Object.wait(), Thread.join(), 這個執行緒收到中斷訊號後, 會丟擲InterruptedException, 同時會把中斷狀態置回為false.
下面的程式會演示對非阻塞中的執行緒中斷:
- public class Thread3 extends Thread{
- public void run(){
- while(true){
- if(Thread.interrupted()){
- System.out.println("Someone interrupted me.");
- }
- else{
- System.out.println("Going...");
- }
- long now = System.currentTimeMillis();
- while(System.currentTimeMillis()-now<1000){
- // 為了避免Thread.sleep()而需要捕獲InterruptedException而帶來的理解上的困惑,
- // 此處用這種方法空轉1秒
- }
- }
- }
- public static void main(String[] args) throws InterruptedException {
- Thread3 t = new Thread3();
- t.start();
- Thread.sleep(3000);
- t.interrupt();
- }
- }
下面的程式演示的是子執行緒通知父執行緒別等它了:
- public class Thread4 extends Thread {
- private Thread parent;
- public Thread4(Thread parent){
- this.parent = parent;
- }
- public void run() {
- while (true) {
- System.out.println("sub thread is running...");
- long now = System.currentTimeMillis();
- while (System.currentTimeMillis() - now < 2000) {
- // 為了避免Thread.sleep()而需要捕獲InterruptedException而帶來的理解上的困惑,
- // 此處用這種方法空轉2秒
- }
- parent.interrupt();
- }
- }
- public static void main(String[] args){
- Thread4 t = new Thread4(Thread.currentThread());
- t.start();
- try {
- t.join();
- } catch (InterruptedException e) {
- System.out.println("Parent thread will die...");
- }
- }
- }
中斷狀態可以透過 Thread.isInterrupted()來讀取,並且可以透過一個名為 Thread.interrupted()的靜態方法讀取和清除狀態(即呼叫該方法結束之後, 中斷狀態會變成false)。
由於處於阻塞狀態的執行緒 被中斷後丟擲exception並置回中斷狀態, 有時候是不利的, 因為這個中斷狀態可能會作為別的執行緒的判斷條件, 所以穩妥的辦法是在處理exception的地方把狀態復位:
- boolean interrupted = false;
- try {
- while (true) {
- try {
- return blockingQueue.take();
- } catch (InterruptedException e) {
- interrupted = true;
- }
- }
- } finally {
- if (interrupted){
- Thread.currentThread().interrupt();
- }
- }
當程式碼呼叫中須要丟擲一個InterruptedException, 你可以選擇把中斷狀態復位, 也可以選擇向外丟擲InterruptedException, 由外層的呼叫者來決定.
不是所有的阻塞方法收到中斷後都可以取消阻塞狀態, 輸入和輸出流類會阻塞等待 I/O 完成,但是它們不丟擲 InterruptedException,而且在被中斷的情況下也不會退出阻塞狀態.
嘗試獲取一個內部鎖的操作(進入一個 synchronized 塊)是不能被中斷的,但是 ReentrantLock 支援可中斷的獲取模式即 tryLock(long time, TimeUnit unit)。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-2121861/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【轉】理解java執行緒的中斷(interrupt)Java執行緒
- Java執行緒:執行緒中斷Java執行緒
- Java執行緒中斷的本質深入理解Java執行緒
- Java執行緒的中斷Java執行緒
- 中斷JAVA執行緒Java執行緒
- Java 可中斷執行緒Java執行緒
- Java執行緒中斷與終止執行緒執行Java執行緒
- java中執行緒池的生命週期與執行緒中斷Java執行緒
- Java的Interrupt與執行緒中斷Java執行緒
- Java多執行緒/併發08、中斷執行緒 interrupt()Java執行緒
- 執行緒的中斷執行緒
- 【Java面試】如何中斷一個正在執行的執行緒?Java面試執行緒
- 執行緒中斷以及執行緒中斷引發的那些問題執行緒
- Java執行緒診斷Java執行緒
- Java多執行緒17:中斷機制Java執行緒
- 深入理解JVM(③)執行緒與Java的執行緒JVM執行緒Java
- 深入分析Java執行緒中斷機制Java執行緒
- Java中的執行緒Java執行緒
- Java併發程式設計之執行緒篇之執行緒中斷(三)Java程式設計執行緒
- java多執行緒程式設計:你真的瞭解執行緒中斷嗎?Java執行緒程式設計
- java 最大執行緒數理解Java執行緒
- 理解 Python 中的執行緒Python執行緒
- 理解Python中的執行緒Python執行緒
- Java 執行緒中斷(interrupt)與阻塞 (park)的區別Java執行緒
- 執行緒和執行緒池的理解與java簡單例子執行緒Java單例
- java 執行緒鎖物件鎖的理解Java執行緒物件
- JAVA中執行緒的建立Java執行緒
- Java中的執行緒同步Java執行緒
- Java中的多執行緒Java執行緒
- JAVA中的執行緒世界Java執行緒
- Java中的執行緒-1Java執行緒
- 多執行緒-執行緒控制之中斷執行緒執行緒
- 【雜談】執行緒中斷——Interrupt執行緒
- 跟著GPT學習Java執行緒中斷機制GPTJava執行緒
- Java中的執行緒安全:從synchronized到Lock的深入理解Java執行緒synchronized
- 理解 python 中多執行緒Python執行緒
- 從 JDK 原始碼角度看 java 併發執行緒的中斷JDK原始碼Java執行緒
- Java 中的執行緒 threadJava執行緒thread