2013-10-15 61 views

回答

1

書面Oracle文檔JAVA FORK/JOIN在:

的fork/join框架是ExecutorService的界面,幫助你把多個處理器的優勢的實現。它被設計用於可以遞歸地分解成小塊的工作。目標是使用所有可用的處理能力來提高應用程序的性能。

所以它的主要目標是多處理器架構。

0

如果有大量的IO操作,多線程在單核處理器上仍然很有用。否則它甚至會受傷。

+0

我明白多線程的優點,但問題是如果用於將大任務分割爲小子任務的FJ可以幫助 –

+0

那麼,如果任務包含大量的IO操作,那麼我的答案是相關的。 – popfalushi

+0

但是爲這個使用FJ還是值得的,或者最好創建一個執行IO的單獨線程? –

2

單個處理器(單個單核處理器)號不能利用多個線程,因爲它只能在一次運行一個線程。實際上,線程管理的開銷會使您的計算速度下降一點。

相關:您可以在運行時獲取應用程序可用的處理器數量。見Runtime.availableProcessors()

+0

當第一個線程由於某種原因進入休眠狀態時,第二個線程就可以開始執行了。單核CPU上的多線程可能有優勢。 –

+1

我不認爲我在跟隨你的想法。是的,你說的是真的。然而,我無法構成一個例子,這將有助於將單個任務分解爲多個線程。 –

+0

@Slanec這發生在一個線程必須等待IO操作完成;就像等待從磁盤讀取數據一樣。多線程有助於單核取決於任務。作爲多線程幫助考慮編譯大量源文件的例子。 –

1

通常在運行時使用處理器的數量來確定執行的配置。

即使您有一臺核心機器,您也許有能力在一次執行多個線程,因此您可以使用f.e.的fork-join。 如果你真的在你的cpu上只有一個執行線程,那麼與簡單執行相比,使用多線程框架會產生很小的開銷。另一方面:如果你在一臺核心機器上編寫你的應用程序並且沒有從中獲利,那麼你可能稍後可以使用不同的機器,或者將應用程序交給具有多核/線程機器的用戶。如果沒有再次構建應用程序或更改任何內容,那麼您可以使用該功能。

所以它真的取決於您期望現在和未來使用您的應用程序的方式。

0

每個處理器有一個線程調度器可以分配的時間來一個單一線程做它的工作。所以如果你有100個線程和一個處理器,調度器將在這100個線程之間切換。但是,據說,在單個處理器上使用多個線程沒有任何優勢,因爲正如我所描述的那樣,它發生的實際情況是調度器只是在非常快的線程之間切換。另外,從CPU的角度來看,上下文切換非常緩慢。

+0

我_這是我寫的。當然你可以有多個線程。但處理器一次只能運行一個(並在它們之間切換,這是導致我提到的開銷)。無論如何,在多線程上運行計算永遠不會比在單線程中運行速度快,是嗎? –

+0

是的,對不起,你肯定是對的。我可能會急於閱讀那裏的線條。 –