2013-03-18 75 views
22

Java Thread本身實現了Java Runnable!並根據大部分互聯網專家,implements Runnable is preferred over extends Thread!即使we cannot use utilize Runnable在線程意義上與Thread類無關!
那麼爲什麼我們寧願實現Runnable了,因爲延長Thread在這兩種情況下的實際線程通過調用Thread實現的方法(即start()run())雖然在Thread情況下,我們是不是真正的「推」的Thread功能說明通過僅覆蓋run()方法?爲什麼「implements Runnable」優於「extends Thread」?

我很抱歉,如果我聽起來很迷惑..!

+0

線程是硬控制。看看執行者,看看更好的方法。他們採取可調式和可運行的,而不是線程。在情況下,如果,特定於應用,在將來或現在,我們沒有必要繼承已經繼承類 – 2013-03-18 08:03:47

回答

60

最常見的區別是:

當你繼承Thread類,你不能擴展你需要的任何其他類。 (如你所知,Java不允許繼承多個類)。當您實現Runnable時,您可以爲您的課程節省一個空間,以便將來或現在擴展任何其他課程。

然而,顯着差異是。

擴展Thread類時,每個線程都會創建唯一的對象並與其關聯。當你實現Runnable時,它將共享同一個對象給多個線程。

檢查: http://manikandanmv.wordpress.com/tag/extends-thread-vs-implements-runnable/

+0

手段(從線程繼承)和應用程序似乎並沒有面對存儲問題,那麼可運行和線程,都應該有平等的機會..? – Tariq 2013-03-18 07:24:30

+0

然後他們會。 – Aashray 2013-03-18 08:27:11

+0

一個面向對象的,其基本原理是,「始終節目在實現一個接口」 – footy 2013-11-18 15:05:19

4

一個類可能只有一個超類,但可以實現任意數量的接口。通過擴展Thread,你放棄了其他任何子類的機會。

1

的Java只允許單繼承,這意味着,如果你從Thread繼承,你將無法從任何其他類繼承。實現Runnable接口不具有此限制,因爲您的類可以實現任意數量的接口。

6

如果你的類是繼承Thread類那麼它變成一個單獨的線程,其繼承的屬性Thread類,因此這將是沉重的。 (當擴展Thread類時,每個線程創建唯一對象並與之關聯,但當實現Runnable時,它將共享同一個對象給多個線程)。

如果你的類是實現Runnable接口那麼你只覆蓋run()。所以這種情況下創建一個單獨的Thread和每個人單獨線程而不是運行在你的程序中的一個沉重主題。 另一件事,因爲Java不支持多重繼承,如果你實現Runnable你會避免延長多的問題,因此,如果您實現Runnable接口你可以擴展你必須比其他任何類線程類。

+0

如何對內存的消耗,...將是可運行的執行和新的Thread()語句實際上是一樣的嗎? (如果多次呼叫一次很貴)? – gumuruh 2016-12-07 00:30:34

-3

你真的很迷惑。反正一個原因,我知道,我們可以使用Runnable接口實現相同的功能,所以我們應該去,因爲如果我們將實現Runnable那麼我們可以擴展其他類,這是不可能的,如果我們將擴展Thread類

相關問題