我知道在Java線程中implements Runnable
is preferred over extends Thread
,因爲它允許我們在需要時擴展其他一些類。但是如果是這樣的話,extends Thread
與implements Runnable
相比也有其自身的優勢,如果是的話,這些優勢是什麼?爲什麼'extends Thread'存在,當'implements Runnable'在所有情況下都是贏家時
回答
因爲有時(幾乎從不,但有時)你想要改變Thread
的基本行爲。
那時你需要擴展它。
您可以通過覆蓋Thread
類中的方法來更改它,但不能通過實施Runnable
中的方法來實現。
示例[here](http://stackoverflow.com/questions/34905333/in-run-method-how-to-find-from-where-start-被稱爲/ 34905821#34905821) - 提問者想知道哪個線程創建/啓動此線程。重寫構造函數和'start'來完成。 – OldCurmudgeon
在Java 1.0發佈後的最近20多年中,什麼被認爲是一種好的設計模式已經發生了變化。但是,Java致力於向後兼容,這意味着舊代碼可能會使用糟糕的設計模式仍然可行。
我的一個寵物討厭的地方是StringBuffer
,它不是一個好主意,使它的方法同步,幾十年前被取代,但不幸的是開發人員今天不會阻止使用它,甚至新開發人員也使用它,即使它們在開始使用Java之前已經被棄用了。
阻止runnables和線程之間的選擇與「設計模式」無關,這沒有任何意義。這些是兩種不同的用例場景 – specializt
設計模式是組合與繼承。你有什麼兩種不同的用例。子類'線程'很少*關於覆蓋任何東西,除了'run()' –
你似乎認爲'Runnable'與'Thread'有某種關係。那不是。完全一樣。 Runnables是阻塞的,可執行的算法和線程是異步的,獨立的,在調用線程結束後仍然可以運行很長時間。請不要寫關於與你不同的主題的答案,非常感謝。這個問題可以重新擬定爲:「什麼更好:轉基因作物還是最後一個破壞季節?」 - 不計算。 – specializt
- 1. 爲什麼「implements Runnable」優於「extends Thread」?
- 2. Java instanceof implements/extends
- 3. 在這種情況下Thread :: yield()是什麼意思?
- 4. 爲什麼QWebFrame :: evalutateJavaScript在這種情況下什麼都不做?
- 5. 在這種情況下,extends關鍵字意味着什麼?
- 6. 在這種情況下,Java是否'擴展'也意味着'implements'?
- 7. 如何在沒有「implements LocationListener」的情況下使用LocationListener?
- 8. Dabt在所有情況下都是異常的?
- 9. [System.Web.Script.Services.ScriptService]在所有情況下都是無害的嗎?
- 10. 在所有情況下
- 11. 爲什麼在存在memset等情況下ZeroMemory等存在?
- 12. 爲什麼com.ExecuteNonQuery()返回-1 Always。在所有情況下,
- 13. 爲什麼find_one在我的情況下返回所有文檔?
- 14. 爲什麼在這種情況下,當條件指的是一個不存在的節點時,爲什麼在這種情況下不會出現錯誤
- 15. 什麼是wrapper_descriptor,在這種情況下爲什麼是Foo .__ init __()?
- 16. 在什麼情況下做dispatch_async(dispatch_get_main_queue(),^ ...什麼都不做
- 17. 在什麼情況下推斷什麼都不可取?
- 18. 爲什麼在兩種情況下都會出現錯誤?
- 19. JSDoc中是否存在一個Implements或Extends註釋?
- 20. Noobish在當前情況下不存在
- 21. 當:: thread :: wait存在時,爲什麼我的tcl線程退出?
- 22. 爲什麼在以下情況下沒有數據競爭?
- 23. 什麼是在這種情況下
- 24. 什麼是在這種情況下
- 25. 默認情況下,所有方法都是公開的嗎?
- 26. 爲什麼NaN有用,在什麼情況下
- 27. 爲什麼在這三種情況下
- 28. 爲什麼在這種情況下
- 29. 在什麼情況下HTTP_REFERER將爲空
- 30. 爲什麼在這種情況下
@proudandhonour:是的,我讀了這個問題的答案,但所有的答案都解釋了'如何實現可運行'是好的。實際上,這些答案在我的腦海中產生了這個問題。 – rahul
@proudandhonour你會介意回答這個問題的答案嗎?它似乎沒有在前幾個。 – djechlin
考慮場景,當線程啓動時,您想要將該特定線程的詳細信息添加到數據庫。這與您在run()方法中使用的業務邏輯不同,因此您希望將它分開。因此,您將覆蓋start()和run()方法 –