爲什麼不推薦使用Thread.stop?
因爲它本質上是不安全的。停止線程會導致它解鎖所有已鎖定的顯示器。 (由於ThreadDeath異常在堆棧中傳播,所以監視器被解鎖。)如果之前由這些監視器保護的任何對象 處於不一致狀態,則其他線程現在可以以不一致的狀態查看這些對象。據稱這些物體已經損壞。當線程在受損的 對象上運行時,可能導致任意行爲。這種行爲可能是微妙的 難以檢測,或者它可能會發音。不像其他 未經檢查的異常,ThreadDeath靜默殺死線程;因此, 用戶沒有警告他的程序可能會損壞。損壞 可以在實際損壞發生後的任何時間表現出來,甚至在將來 小時或幾天。
應該用什麼來代替Thread.stop?
大部分停止使用應該由簡單的修改一些 變量以指示目標線程應該停止運行的代碼來代替。 目標線程應該定期檢查這個變量,並且如果變量指示它的 要停止運行,則從 有序地返回其運行方法。爲確保及時通知 停止請求,變量必須是易失性的(或者必須對變量 進行同步)。
例如,假設你的小應用程序包含以下啓動,停止和運行方法:
private Thread blinker;
public void start() {
blinker = new Thread(this);
blinker.start();
}
public void stop() {
blinker.stop(); // UNSAFE!
}
public void run() {
while (true) {
try {
Thread.sleep(interval);
} catch (InterruptedException e){
}
repaint();
}
}
您可以通過替換applet的停止和運行方法避免使用使用Thread.stop的: 私人不穩定的線程轉向燈;
public void stop() {
blinker = null;
}
public void run() {
Thread thisThread = Thread.currentThread();
while (blinker == thisThread) {
try {
Thread.sleep(interval);
} catch (InterruptedException e){
}
repaint();
}
}