2014-05-03 67 views
0

我在java彈簧中有一個應用程序。該應用程序需要多線程。所以我使用可調用的&執行器服務,因爲每個線程都會返回一些字符串值。 所以我的問題是如何決定可以保留的最大線程數? 而重要的問題是,如果我繼續增加線程數量,但照顧堆大小的條件,是否會在線程數超過某個限制後開始降低性能?增加線程數是否會降低java的整體性能?

+0

大概。最好的方法是嘗試;) – Tedil

+1

「Java併發實踐」中的「8.2。調整線程池」一節有關於此主題的有用信息http://books.google.ru/books?id=EK43StEVfJIC&pg=PT186&lpg = PT186&dq = Sizing + Thread + Pools + java + concurrency + in + practice&source = bl&ots = un0Gx2sRlr&sig = q6gBylm5pFXWgdyB3bV6KcIQUsI&hl = en&sa = X&ei = LsRkU4vDHcGN4ATvx4C4Dw& ved = 0CEkQ6AEwBA – ka3ak

回答

1

那麼,這樣的問題的最佳答案是「這取決於」。但我可以肯定地指出,它取決於什麼:)

  • 你在一個線程中所做的工作。
  • 代碼是否已經在利用底層硬件的並行特性?
  • 整個代碼是否存在瓶頸,比並行任務需要更多時間?

在JVM中獲取線程基礎結構是一個代價高昂的過程,當您談論線程時,同步也會出現。讓我們暫時忘記同步。即使如此,如果執行的任務比分配和管理線程的開銷更低,我會說嚴格的NO到多線程。

  • 事情是多線程證明是一個福音是當你的首要任務是使網絡電話,有許多這樣的任務。

  • 另一個這樣的要求是做一些獨立的計算,如塊式矩陣乘法。

注意:編譯器現在是一個天做了一些優化,以提高你的代碼的並行處理能力。但以正確的方式編碼的更大責任取決於您。

例如:考慮下面的代碼在數組中添加10個數字。

這似乎是添加數組元素的最佳方法。但低於實際利用處理器的並行處理能力:

total = a[0] = a[1] + a[2] + a[3] + a[4] + a[5] + a[6] + a[7] + a[8] + a[9]; 

明智的選擇:)

+0

謝謝:)。這是一個非常有用的信息。 所以,我可以總結一下,並說:「是的,如果你不明智地選擇它,可能會隨着線程數量的增加而降低性能」? – Abhijit

+0

當然是的......大多數情況下,如果工作量較小,這種做法很糟糕。 當任務非常耗時並且可以並行完成時,這真的很不錯 – dharam

+0

編譯器能夠完成您在筆記本身中指出的代碼轉換。手工做這些東西不是一個好主意 - 當然不是這種情況 – Voo

3

找出使用多少個線程的最好方法是憑經驗。但你可以預先猜測;如果你正在做大量的阻塞IO,你會想要更多的線程。如果你根本沒有做任何IO,而只是使用CPU,那麼你理想的情況是不需要比內核多的線程。您還必須考慮同步開銷,如果您需要大量同步,那麼在多線程上運行該代碼很可能不會提高性能。

同樣,它在很大程度上取決於應用程序。這些都只是經驗法則,你將不得不執行更詳細的分析和一些測試運行實際上能夠告訴你的應用程序。

+0

感謝您的信息, :) 我明白了事情,「在多個線程上運行該代碼並不會提高性能。」但即使不提高性能,它是否會隨着線程數量的增加而降低性能? – Abhijit

+0

@Abhijit如果你做錯了,是的。如果你有太多的線程,你可能最終不得不做大量不必要的上下文切換,這在性能方面是非常昂貴的。 – Cubic

0

簡單的答案是肯定的,因爲線程之間的交換是相當昂貴的。您必須在換出正在等待的線程和其他線程可以獲得某些CPU以及交換費用之間取得平衡。

例如,如果你有100個comsumer線程典型的生產者,我懷疑的吞吐量會比如果你有10

0

最有可能的是,這會降低整體性能要大得多。以下是一些需要考慮的事實:

  • 在大多數情況下,由於CPU /內核數量有限,可以同時運行的線程數量有限;
  • 將一個線程與WAITING狀態一起激活一些其他線程(這是所謂的context switching的一部分)在CPU資源方面相當昂貴;
  • Amdahl定律它提供了問題的答案 - 線程數,CPU,部分「工作」之間的關係可以同時完成併產生加速。這裏很難發佈公式,所以我只留下wiki page link
相關問題