2011-04-17 60 views

回答

1

正如文中所指出的,他們都「工作」,雖然在一般情況下,你應該使用Runnable(或者,如果參數/結果需要CallableFuture),而不是繼承Thread。正如你所指出的那樣,這更加靈活 - 它將從執行它的人中分離出來。擴展線程不必要地將這兩個概念緊密地結合在一起,打破了single responsibility的OO原則。

偶爾,當您的手被API強制執行時,您必須將可執行代碼實現爲Thread的子類。例如,運行時。 addShutdownHook(Thread)要求您在關機時執行的代碼被註冊爲一個Thread實例。但是,如果您不處理這些特定情況之一,那麼請始終使用Runnable

0

作者只是想根據他來傳達,Runnables更容易與線程池一起使用。線程池的概念是可以有固定數量的線程(比如10)等待工作。如果它們中的10個都忙於運行線程,則可以將未完成的工作排隊,直到來自池中的那些線程中的一個空閒爲止。

+0

因此,如果我們有固定數量的線程來執行任務,那麼使用Thread擴展線程和Runnable實現的線程之間有什麼區別。 – darkapple 2011-04-17 06:20:38

+0

檢查:http://www.coderanch.com/how-to/java/ExtendingThreadVsImplementingRunnable 底線: 通過實現Runnable,而不是延長線,您最大限度地減少你可能有,如果你以後改變的代碼量決定使用Executor。 – dreamer13134 2011-04-17 06:27:24

+0

andcorse,executors和所有新的好東西與Runnables一起工作.....在我看來,你不應該擔心J5後的簡單,直接的應用程序的線程 – dreamer13134 2011-04-17 06:31:11

0

Jenkov強調,在子類或Runnable實現之間進行選擇是由於首選項,如果有其他事情。

他指的是thread pool pattern作爲一個例子說明爲什麼可運行接口實現更靈活。我支持他最初的假設,但主要是因爲Runnable對象可以繼承Thread以外的類。

我不太清楚,如何構建線程池將是更麻煩的線程的子類與java本地庫即ie。 java.util.concurrent.ThreadPoolExecutor。我希望Jenkov能夠提供一個例子...

+1

問題是每個Thread對象實際上是一個新的Java線程(通常對應於一個本地線程)。線程池的要點是避免在不需要的情況下創建新線程,因爲這非常昂貴。 – 2011-04-17 15:51:29