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執行緒
- 【雜談】執行緒中斷——Interrupt執行緒
- JAVA多執行緒併發Java執行緒
- java 多執行緒之使用 interrupt 停止執行緒的幾種方法Java執行緒
- java多執行緒與併發 - 執行緒池詳解Java執行緒
- Java併發程式設計之執行緒篇之執行緒中斷(三)Java程式設計執行緒
- 多執行緒併發篇——如何停止執行緒執行緒
- Java 執行緒中斷(interrupt)與阻塞 (park)的區別Java執行緒
- 多執行緒與高併發(二)執行緒安全執行緒
- 併發與多執行緒之執行緒安全篇執行緒
- Java多執行緒-執行緒中止Java執行緒
- 多執行緒與高併發(一)多執行緒入門執行緒
- Java 併發:執行緒、執行緒池和執行器全面教程Java執行緒
- Java併發 之 執行緒池系列 (1) 讓多執行緒不再坑爹的執行緒池Java執行緒
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- Java併發(四)----執行緒執行原理Java執行緒
- Java多執行緒之執行緒中止Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- java 多執行緒守護執行緒Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- java多執行緒9:執行緒池Java執行緒
- 【java多執行緒】(二)執行緒停止Java執行緒
- Thread interrupt() 執行緒中斷的詳細說明thread執行緒
- java多執行緒與併發 - 併發工具類Java執行緒
- Java執行緒的中斷Java執行緒
- JAVA多執行緒和併發基礎Java執行緒
- Java多執行緒與併發之ThreadLocalJava執行緒thread
- Java併發/多執行緒-CAS原理分析Java執行緒
- java多執行緒程式設計:你真的瞭解執行緒中斷嗎?Java執行緒程式設計
- Java併發實戰一:執行緒與執行緒安全Java執行緒
- 【多執行緒與高併發】Java守護執行緒是什麼?什麼是Java的守護執行緒?執行緒Java
- 執行緒中斷以及執行緒中斷引發的那些問題執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- 【Java】【多執行緒】執行緒池簡述Java執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- 【Java多執行緒】輕鬆搞定Java多執行緒(二)Java執行緒
- java中執行緒池的生命週期與執行緒中斷Java執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒