2016-01-22 64 views
16

我知道在Java線程中implements Runnable is preferred over extends Thread,因爲它允許我們在需要時擴展其他一些類。但是如果是這樣的話,extends Threadimplements Runnable相比也有其自身的優勢,如果是的話,這些優勢是什麼?爲什麼'extends Thread'存在,當'implements Runnable'在所有情況下都是贏家時

+4

@proudandhonour:是的,我讀了這個問題的答案,但所有的答案都解釋了'如何實現可運行'是好的。實際上,這些答案在我的腦海中產生了這個問題。 – rahul

+1

@proudandhonour你會介意回答這個問題的答案嗎?它似乎沒有在前幾個。 – djechlin

+0

考慮場景,當線程啓動時,您想要將該特定線程的詳細信息添加到數據庫。這與您在run()方法中使用的業務邏輯不同,因此您希望將它分開。因此,您將覆蓋start()和run()方法 –

回答

30

因爲有時(幾乎從不,但有時)你想要改變Thread的基本行爲。

那時你需要擴展它。

您可以通過覆蓋Thread類中的方法來更改它,但不能通過實施Runnable中的方法來實現。

+6

示例[here](http://stackoverflow.com/questions/34905333/in-run-method-how-to-find-from-where-start-被稱爲/ 34905821#34905821) - 提問者想知道哪個線程創建/啓動此線程。重寫構造函數和'start'來完成。 – OldCurmudgeon

18

在Java 1.0發佈後的最近20多年中,什麼被認爲是一種好的設計模式已經發生了變化。但是,Java致力於向後兼容,這意味着舊代碼可能會使用糟糕的設計模式仍然可行。

我的一個寵物討厭的地方是StringBuffer,它不是一個好主意,使它的方法同步,幾十年前被取代,但不幸的是開發人員今天不會阻止使用它,甚至新開發人員也使用它,即使它們在開始使用Java之前已經被棄用了。

+2

阻止runnables和線程之間的選擇與「設計模式」無關,這沒有任何意義。這些是兩種不同的用例場景 – specializt

+0

設計模式是組合與繼承。你有什麼兩種不同的用例。子類'線程'很少*關於覆蓋任何東西,除了'run()' –

+0

你似乎認爲'Runnable'與'Thread'有某種關係。那不是。完全一樣。 Runnables是阻塞的,可執行的算法和線程是異步的,獨立的,在調用線程結束後仍然可以運行很長時間。請不要寫關於與你不同的主題的答案,非常感謝。這個問題可以重新擬定爲:「什麼更好:轉基因作物還是最後一個破壞季節?」 - 不計算。 – specializt

相關問題