2013-11-14 68 views
0

我有一個問題要問下面的語句Java線程 - 爲什麼停止一個新的線程被允許

當一個線程是一個新的線程,它僅僅是一個空的線程對象。系統資源尚未分配到 。當一個線程處於 這個狀態時,你只能啓動線程或停止它。當線程處於此狀態時,除啓動或停止外,調用任何 方法都不會使 有意義並導致IllegalThreadStateException

爲什麼java允許停止一個甚至沒有啓動的線程......在這種情況下,必須調用stop()和一個新線程?

+0

我懷疑有一個特定的情況需要發生。他們可能認爲這並不重要,所以它不需要拋出異常。所以你可以自由地在線程上調用stop(),而不必確定它們是否先啓動。 – Kayaman

+2

stop()已被棄用,不應被調用,如文檔所示。 –

+1

我會以另一種方式說:爲什麼你應該禁止停止一個沒有運行的線程? – Zane

回答

0

首先不要使用已標記爲deprecated的功能。

由於documentation指示停止,

它允許停止尚未啓動的線程。如果線程最終啓動,它會立即終止。

此外,如果我看codeStop

@Deprecated 
public final void stop() { 
    // If the thread is already dead, return. 
    // A zero status value corresponds to "NEW". 
    if ((threadStatus != 0) && !isAlive()) { 
     return; 
    } 
    stop1(new ThreadDeath()); 
} 

正如可以從代碼看到它被設計成使得,它當threadStatus != 0(A零個狀態值對應於狀態正常返回「NEW」)或者線程已經停止。

0

其他答案解決了具體問題,所以我會嘗試談論它背後更普遍的想法。基本上,如果設計者不允許被調用的方法,他們試圖檢測編程錯誤。在設計者的觀點中,當線程從未啓動時調用interrupt()似乎可能是一個bug,而stop()的調用看起來並不那麼明顯。

還有其他類似的例子。例如,可以多次調用Future#cancel()

最終我認爲有一種主觀性/偏好的元素,儘管在某些情況下比另一種更明顯。