2017-05-04 70 views
-1

我們可以使用Implementing Runnable或擴展線程類來創建線程。任何人都可以告訴我性能明智哪個更快地實現Runnable或擴展Thread類以及爲什麼?另外我知道在實現Runnable時,我們可以實現更多的接口並擴展一個類。如果我們直接擴展一個Thread類,那麼擴展一個類是我們失去的東西。但在這兩種情況下是否有任何性能差異性能明智,實現Runnable或擴展Thread類的速度更快

+2

這不是性能問題。沒有可衡量的差異。應該首選Runnable,因爲你應該使用像Executor這樣的新併發類,而不是Thread。這些都採用Runnables。這有一個很好的理由。 – duffymo

+1

我認爲關於「性能」沒有實際的區別(你的意思是什麼?執行速度更快,內存消耗更好?)。 Class和Interface的主要原因之一是在Java中你不能有多重繼承,所以根據你的設計,你的類可能已經擴展了另一個類,而你所需要的只是實現Runnable。 –

+0

我的意思是執行速度更快。我知道在實現Runnable時,我們可以實現更多的接口並擴展一個類。如果我們直接擴展一個Thread類,那麼擴展一個類是我們失去的東西。但是在這兩種情況下是否有任何性能差異 – user2821056

回答

0

表現方面兩者沒有區別。然而,使用「implements Runnable」更好,因爲它給你更多的自由(擴展另一個類,...),同一個對象在多個線程之間共享(這也減少了使用的內存)。

+1

這只是故事的一點。延長線程風險更大 – Stultuske

+0

這個解釋很薄。這不是關於「自由」,而是關於正確的建模。並且(實際上)永遠不會將在線程內部運行的內容建模爲線程。 「表現」是一種紅鯡魚,只有在正確性被理解之前纔在這個層面上被問到。 –

0

這取決於(一如既往):

  • 如果你想運行它只有一次,Thread擴展沒有缺點,除了它是不夠靈活,更難測試(例如,在一個單元測試)。
  • 如果您想更頻繁地運行它,Runnable會更靈活,因爲您可以使用線程池將它傳遞給Executor。通過這樣做,您可以獲得更好的性能,因爲每次執行的線程創建開銷都將被刪除。

如果實現Runnable你有不同的方式(在單元測試同步,使用執行,或者即使有Thread包裝也無妨),以執行代碼。而純粹的線程擴展永遠不會有更好的性能,它只能是平等的。僅通過允許多個接口或使用獨立繼承來實現Runnable總是更好的選擇,這只是更好的設計。在此之後我絕不會延伸Thread

+0

問題是,如果您的類型是_is-a_'Thread',那麼您在* Thread中運行的內容應該只擴展'Thread',而不是。不過,它是_is-a_'Runnable'。所以問題不是「哪個表現更好?」這是一個可怕的問題。一個很好的問題是,「哪個是正確的?」和「哪個會導致更少的錯誤?」正確的工程每次都會帶來不確定的微觀「優化」。做對,讓「表演」自己照顧自己。 –

相關問題