2013-06-02 15 views
0

"Effective Java book"引述:爲什麼Thread.stop()方法不安全使用?

「的庫提供的使用Thread.stop方法,但這種方法是 過時很久以前,因爲它本質上是不安全的,它的使用可能會導致數據損壞 不要使用使用Thread.stop

誰能告訴我爲什麼

+1

使用它是不安全的,這是不同於線程安全的。 –

+1

你在哪裏讀到它不是線程安全的? – Blackbelt

+1

你讀過這個方法的javadocs嗎? –

回答

6

如果您停止的線程持有關鍵鎖定會怎麼樣?如果線程將對象置於不一致的狀態並且還沒有機會恢復它呢?停止線程的正確方法是與其合作,而不是強迫它從外部停止。

此外,它根本沒有邏輯意義。應用程序中的所有線程都應該合作來實現相同的目標。如果有什麼不該做的事情,沒有線程應該這樣做。應該沒有理由阻止一個線程 - 它應該只被編碼來做某件事,如果這是應用程序作爲整體需求完成的。如果一個線程需要被停止,那只是因爲它正在運行的代碼被破壞了 - 即使它們不應該完成,它們也會執行。只需修復該代碼即可。

+0

什麼如果你有一個用於GUI管理的線程,並且線程用於資源加載?一旦加載了所有的資源,應該對資源加載線程做些什麼? – w4etwetewtwet

+0

資源加載線程應該終止,如果它沒有工作要做。或者你可以設計它,等待稍後有更多的工作要做。隨你便。 –

5

根據JavaDoc:

爲什麼使用Thread.stop已過時?

因爲它本質上是不安全的。停止線程會導致它解鎖所有已鎖定的顯示器。 (由於ThreadDeath異常在堆棧中傳播,所以監視器被解鎖。)如果之前由這些監視器保護的任何對象 處於不一致狀態,則其他線程現在可以以不一致的狀態查看這些對象。據稱這些物體已經損壞。當線程在受損的 對象上運行時,可能導致任意行爲。這種行爲可能是微妙的 難以檢測,或者它可能會發音。不像其他 未經檢查的異常,ThreadDeath靜默殺死線程;因此, 用戶沒有警告他的程序可能會損壞。損壞 可以在實際損壞發生後的任何時間表現出來,甚至在將來 小時或幾天。

欲瞭解更多信息,請閱讀:

http://docs.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

+0

+1鏈接。 – tarrsalah

1

簡而言之,stop強行中止線程沒有給它任何機會進行清理。最典型的結果是一團糟。

2

恕我直言,這只是不安全的,如果你用它來阻止另一個線程。您可以使用它來停止當前的線程,而不會出現正常的問題,例如如果你需要重新拋出一個檢查的異常。

stop()的問題是,你不知道在哪個線程中拋出異常或錯誤。唯一的一次你會考慮使用它是阻止行爲不正確的第三方線程。問題是這樣的線程可以捕獲並忽略這個觸發的錯誤。如果你真的有不安全或不可靠的代碼需要運行,我建議你使用一個單獨的進程,你可以根據需要殺死它。

相關問題