原理:new乙個thread物件,如:thread thread=new thread(runnable介面的實現類);然後呼叫thread.interrupt()方法
使用thread.interrupt(),只是發出中段訊號,執行緒停不停止並不由自己決定,而是由被停止的執行緒決定,不是強制停止執行緒。
/**
* run內沒有sleep或者wait方法時,停止執行緒
*/public class rightwaystopthreadwithoutsleep implements runnable
num++;
}system.out.println("任務執行結束了");
}public static void main(string args) catch (interruptedexception e)
thread.interrupt();
}}
/**
* 帶有sleep方法中斷執行緒
*/public class rightwaystopthreadwithsleep
num++;
}thread.sleep(10000);//讓執行緒阻塞10秒
}catch (interruptedexception e )
};thread thread=new thread(runnable);
thread.start();
thread.sleep(9000);//我們在10s處無法中斷,因為10s時人家已經沒有停止,也就無法中斷
thread.interrupt();
}}
每次迭代(迴圈)都阻塞情況下停止執行緒:
/**
* 在使用過程中,每次迴圈都會呼叫sleep或wait等方法,那麼就不需要每次迭代都要檢查是否已經中斷
*/public class rightwaystopthreadeveryloop
num++;
system.out.println(thread.currentthread().getname());
thread.sleep(100);//讓執行緒阻塞0.01秒,所以出現列印的過程比較慢
//這個過程執行緒可能就會收到這個通知,將執行緒停止
}}catch (interruptedexception e )
};thread thread=new thread(runnable);
thread.start();
thread.sleep(5000);//讓執行緒執行到第五秒時停止
system.out.println(thread.currentthread().getname());
thread.interrupt();//傳送停止訊息,
}}
這裡要注意一種情況:就是while裡面方法try/catch的問題,一旦響應中斷,會將interrupt標記位清除
/**
* 如果while裡面放try-catch,會導致中斷失效
*/public class cantinterrupt
num++;
try catch (interruptedexception e) }};
thread thread=new thread(runnable);
thread.start();
thread.sleep(500);//主動傳送訊號
system.out.println(thread.currentthread().getname());
thread.interrupt();
}}
最佳停止執行緒的二種方法:
/**
* 最佳實踐:catch住了interruptedexception之後優先選擇:在方法簽名中丟擲異常
* 那麼在run()就會強制try/catch
*/public class rightwaystopthreadinproduct implements runnable catch (interruptedexception e) }}
private void throwinmethod() throws interruptedexception
public static void main(string args) throws interruptedexception
}
/**
* 最佳實踐2:在catch字句中呼叫thread.currentthread().isinterrupted()
* 來恢復設定中斷狀態,以便在後續的執行中,依然能夠檢查到剛才發生了中斷
*/public class rightwaystopthreadinproduct2 implements runnable
reinterrupe();}}
private void reinterrupe() catch (interruptedexception e)
}public static void main(string args) throws interruptedexception
}
最後補充一點關於異常的資訊:error和runtimeexception都是非檢查異常,也即是編譯器無法**的,而其他的異常都是受檢查異常 如何正確停止執行緒
使用interrupt來通知,並不是強制中斷,換句話說也就是不能強制停止執行緒,沒有停止執行緒的權力。當執行緒被阻塞時,會以拋異常的方式直接響應中斷訊號,不需要再像一種情況那樣進行判斷。如果在執行過程中,每次迴圈都會呼叫sleep或wait等方法,那麼不需要每次迭代都檢查是否已中斷,因為在阻塞狀態中...
如何停止執行緒?
使用退出標誌,使執行緒正常退出,也就是當run方法完成後執行緒終止。使用stop方法強行終止執行緒 這個方法不推薦使用,因為stop和suspend resume一樣,也可能發生不可預料的結果 使用interrupt方法中斷執行緒。表示讓當前等待的執行緒直接丟擲異常 如下 package com.n...
如何正確的更好的停止乙個執行緒?
前面提到過三種停止執行緒的方式,這三種方式不是被廢棄就是可能造成return汙染,最後雖然建議用拋異常法,但拋異常法依靠的是異常處理機制,下面介紹一種更常用的的停止執行緒的方法 通過在實現runnable介面的類裡面 或者是在繼承thread類的類裡面 定義乙個boolean型別的變數 標記 然後對...