1. 程式人生 > >Java執行緒stop和suspend的廢棄

Java執行緒stop和suspend的廢棄

JDK1.0定義了stop和suspend方法,stop用來直接終止執行緒,suspend會阻塞執行緒直到另一個執行緒呼叫resume.
stop和suspend都有一些共同的點:都試圖專橫的控制一個給定了的執行緒的行為.

從JDK1.2開始,這兩個方法都被棄用了.stop天生就不安全,而經驗告訴我們呢suspend方法會經常導致死鎖。

反對使用stop(),是因為它不安全。它會解除由執行緒獲取的所有鎖定,當在一個執行緒物件上呼叫stop()方法時,這個執行緒物件所執行的執行緒就會立即停止,假如一個執行緒正在執行:synchronized void { x = 3; y = 4;} 由於方法是同步的,多個執行緒訪問時總能保證x,y被同時賦值,而如果一個執行緒正在執行到x = 3;時,被呼叫了 stop()方法,即使在同步塊中,它也乾脆地stop了,這樣就產生了不完整的殘廢資料。而多執行緒程式設計中最最基礎的條件要保證資料的完整性,所以請忘記執行緒的stop方法,以後我們再也不要說“停止執行緒”了。而且如果物件處於一種不連貫狀態,那麼其他執行緒能在那種狀態下檢查和修改它們。結果 很難檢查出真正的問題所在。

suspend()方法容易發生死鎖。呼叫suspend()的時候,目標執行緒會停下來,但卻仍然持有在這之前獲得的鎖定。此 時,其他任何執行緒都不能訪問鎖定的資源,除非被"掛起"的執行緒恢復執行。對任何執行緒來說,如果它們想恢復目標執行緒,同時又試圖使用任何一個鎖定的資源,就 會造成死鎖。所以不應該使用suspend(),而應在自己的Thread類中置入一個標誌,指出執行緒應該活動還是掛起。若標誌指出執行緒應該掛起,便用 wait()命其進入等待狀態。若標誌指出執行緒應當恢復,則用一個notify()重新啟動執行緒。