目前,我正在讀一本Java併發教程http://tutorials.jenkov.com/java-concurrency/creating-and-starting-threads.html瞭解Java併發螺紋
我不明白什麼如下行下「子類或Runnable的?」
當通過線程池執行Runnable時,可以輕鬆地對Runnable實例進行排隊,直到池中的線程空閒爲止。
目前,我正在讀一本Java併發教程http://tutorials.jenkov.com/java-concurrency/creating-and-starting-threads.html瞭解Java併發螺紋
我不明白什麼如下行下「子類或Runnable的?」
當通過線程池執行Runnable時,可以輕鬆地對Runnable實例進行排隊,直到池中的線程空閒爲止。
正如文中所指出的,他們都「工作」,雖然在一般情況下,你應該使用Runnable
(或者,如果參數/結果需要Callable
用Future
),而不是繼承Thread
。正如你所指出的那樣,這更加靈活 - 它將從執行它的人中分離出來。擴展線程不必要地將這兩個概念緊密地結合在一起,打破了single responsibility的OO原則。
偶爾,當您的手被API強制執行時,您必須將可執行代碼實現爲Thread的子類。例如,運行時。 addShutdownHook(Thread)要求您在關機時執行的代碼被註冊爲一個Thread實例。但是,如果您不處理這些特定情況之一,那麼請始終使用Runnable
。
作者只是想根據他來傳達,Runnables更容易與線程池一起使用。線程池的概念是可以有固定數量的線程(比如10)等待工作。如果它們中的10個都忙於運行線程,則可以將未完成的工作排隊,直到來自池中的那些線程中的一個空閒爲止。
Jenkov強調,在子類或Runnable實現之間進行選擇是由於首選項,如果有其他事情。
他指的是thread pool pattern作爲一個例子說明爲什麼可運行接口實現更靈活。我支持他最初的假設,但主要是因爲Runnable對象可以繼承Thread以外的類。
我不太清楚,如何構建線程池將是更麻煩的線程的子類與java本地庫即ie。 java.util.concurrent.ThreadPoolExecutor。我希望Jenkov能夠提供一個例子...
問題是每個Thread對象實際上是一個新的Java線程(通常對應於一個本地線程)。線程池的要點是避免在不需要的情況下創建新線程,因爲這非常昂貴。 – 2011-04-17 15:51:29
Jenkov在他的併發教程中進一步描述了使用ExecutorService工廠方法的固定和緩存線程池。看看這裏:http://tutorials.jenkov.com/java-util-concurrent/executorservice.html。使用創建這些線程池的Java併發實用程序,使用runnable更容易。
因此,如果我們有固定數量的線程來執行任務,那麼使用Thread擴展線程和Runnable實現的線程之間有什麼區別。 – darkapple 2011-04-17 06:20:38
檢查:http://www.coderanch.com/how-to/java/ExtendingThreadVsImplementingRunnable 底線: 通過實現Runnable,而不是延長線,您最大限度地減少你可能有,如果你以後改變的代碼量決定使用Executor。 – dreamer13134 2011-04-17 06:27:24
andcorse,executors和所有新的好東西與Runnables一起工作.....在我看來,你不應該擔心J5後的簡單,直接的應用程序的線程 – dreamer13134 2011-04-17 06:31:11