Java多執行緒/併發08、中斷執行緒 interrupt()
一個執行緒是否能讓另一個執行緒停止執行?除了執行緒同步互斥機制之外,還有兩種方法:
- 可以使用Thread.stop(), Thread.suspend(), Thread.resume()
和Runtime.runFinalizersOnExit() 這些終止執行緒執行的方法 。但這些方法已經被廢棄(The method stop() from the type Thread is deprecated),使用它們是極端不安全的。 - Thread.interrupt() 方法是很好的選擇。
public class InterruptDemo {
public static void main(String[] args) throws InterruptedException {
Runnable r = new TestRunnable();
Thread th1 = new Thread(r);
th1.start();
/*三秒後中斷執行緒th1*/
Thread.sleep(3000);
th1.interrupt();
}
}
class TestRunnable implements Runnable {
public void run() {
while (true) {
System.out.println("Thread is running...");
long time = System.currentTimeMillis();// 獲取系統時間的毫秒數
while((System.currentTimeMillis() - time < 1000)){
/*程式迴圈執行1秒鐘,不同於sleep(1000)會阻塞程式。*/
}
}
}
}
執行發現,執行緒th1並沒有預期中斷。
為什麼呢?
每一個執行緒都有一個屬性:中斷狀態(interrupted status) ,可以通過Thread.currentThread().isInterrupted()
來檢查這個布林型的中斷狀態。
當呼叫th1.interrupt()
時,只是改變了執行緒th1的中斷狀態。要想真正讓執行緒th1中斷,只能是th1自己來實現任務控制。
在上面的程式中,把TestRunnable類中的while (true)修改為while (!Thread.currentThread().isInterrupted())
,程式即可達到我們期望
interrupt無法修改正在阻塞狀態(如被Object.wait, Thread.join和Thread.sleep三種方法之一阻塞時)的執行緒。如果嘗試修改,會觸發異常:java.lang.InterruptedException
上面的程式把TestRunnable修改成:
class TestRunnable implements Runnable {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("Thread is running...");
long time = System.currentTimeMillis();// 獲取系統時間的毫秒數
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.print(e.getMessage());
}
}
}
}
執行幾秒便會報錯,因為當執行緒在Thread.sleep時,外部執行緒嘗試呼叫interrupt()修改它的中斷狀態(interrupted status) 。
Core Java中有這樣一句話:”沒有任何語言方面的需求要求一個被中斷的程式應該終止。中斷一個執行緒只是為了引起該執行緒的注意,被中斷執行緒可以決定如何應對中斷 “。
換言之,沒有任何人可以逼迫美女嫁給自己,告訴她“我要娶你”是你的事,至於嫁不嫁最終由她決定。
相關文章
- Java的Interrupt與執行緒中斷Java執行緒
- 【轉】理解java執行緒的中斷(interrupt)Java執行緒
- 【雜談】執行緒中斷——Interrupt執行緒
- Java執行緒:執行緒中斷Java執行緒
- JAVA多執行緒併發Java執行緒
- 執行緒中斷方法interrupt() 與 cancel()執行緒
- java 多執行緒之使用 interrupt 停止執行緒的幾種方法Java執行緒
- java多執行緒與併發 - 執行緒池詳解Java執行緒
- 多執行緒-執行緒控制之中斷執行緒執行緒
- java 多執行緒 併發 面試Java執行緒面試
- Java併發程式設計之執行緒篇之執行緒中斷(三)Java程式設計執行緒
- Java 併發和多執行緒(一) Java併發性和多執行緒介紹[轉]Java執行緒
- 多執行緒併發篇——如何停止執行緒執行緒
- Java執行緒中斷與終止執行緒執行Java執行緒
- Java 執行緒中斷(interrupt)與阻塞 (park)的區別Java執行緒
- Java多執行緒——執行緒Java執行緒
- Java多執行緒/併發12、多執行緒訪問static變數Java執行緒變數
- 中斷JAVA執行緒Java執行緒
- Java多執行緒/併發06、執行緒鎖Lock與ReadWriteLockJava執行緒
- Java併發和多執行緒:序Java執行緒
- 多執行緒與高併發(二)執行緒安全執行緒
- 併發與多執行緒之執行緒安全篇執行緒
- Java多執行緒/併發07、Thread.Join()讓呼叫執行緒等待子執行緒Java執行緒thread
- 【java 多執行緒】多執行緒併發同步問題及解決方法Java執行緒
- Java多執行緒-執行緒中止Java執行緒
- Java多執行緒——執行緒池Java執行緒
- 多執行緒與高併發(一)多執行緒入門執行緒
- Java 併發:執行緒、執行緒池和執行器全面教程Java執行緒
- Java併發 之 執行緒池系列 (1) 讓多執行緒不再坑爹的執行緒池Java執行緒
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- Java多執行緒/併發11、執行緒同步通訊:notify、waitJava執行緒AI
- Java併發(四)----執行緒執行原理Java執行緒
- 多執行緒程式設計,處理多執行緒的併發問題(執行緒池)執行緒程式設計
- java中多執行緒併發的處理方式Java執行緒
- java多執行緒與併發 - 併發工具類Java執行緒
- Java多執行緒17:中斷機制Java執行緒
- JAVA多執行緒和併發基礎Java執行緒
- Java併發/多執行緒-CAS原理分析Java執行緒