2017-02-20 26 views
0

如果是,請舉例說明。如果重複暫停/恢復線程,性能可能會受損嗎?

例如,當我們繼續我們的線程,它需要用它獲取並重新初始化當前狀態可能需要這麼多時間,我們是不關中斷線程都更好的時間。這是一個有效的例子嗎?

+0

如何以及爲什麼要暫停/恢復你的線程?你爲什麼不等待/阻止線程中的事件? –

回答

0

短answear是肯定的,幾乎你線程做的一切介紹了一些類型的開銷,但在大多數情況下,如果你決定使用多線程這是因爲這個成本很容易合理的。停止和恢復線程意味着一些上下文切換,這隻會給應用程序帶來開銷。

停止和恢復的線程應仔細用作本Oracle Doc

對於其它運行時環境,這可能會發生變化,該文檔是簡單地約內Java併發,其他環境可能不同。

Oracle文檔中有關引用某些方法以恢復和暫停線程的危險和棄用的一些引用。這些並不是性能問題,而是概念問題和錯誤。

  • 爲什麼不推薦使用Thread.suspend和Thread.resume?

Thread.suspend本質上容易出現死鎖。如果目標線程在監視器上保留一個鎖定,以便在暫停時保護關鍵系統資源,則在目標線程恢復之前,線程無法訪問此資源。如果恢復目標線程的線程嘗試在調用resume之前鎖定該監視器,則會導致死鎖結果。這種僵局通常表現爲「凍結」的過程。

  • 爲什麼不推薦使用Thread.stop?

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