2011-05-07 51 views

回答

7

JVM的最大線程數通常在千位以內。如果您使用多個線程來優化計算算法,那麼您並不需要超過系統中運行的處理器數量。使用Runtime.getRuntime().availableProcessors()查明。

+0

如果線程被使用,這個數字是否更新? – 2011-05-07 22:27:16

+0

它只會告訴你係統中有多少處理器,而不是剩下多少處理器。 – WhiteFang34 2011-05-07 22:29:52

+0

有沒有這種情況,這是不正確的?在只有幾十個處理器的機器上運行數千個線程,你會在哪裏獲得更好的性能? – Nathan 2011-07-18 19:40:38

0

通過將visualvm附加到您的過程中,您可以看到有多少個線程。我推薦使用所有插件下載的版本1.3.2。

我還建議使用Spring及其執行程序池。這是配置線程池大小的好方法。

2

我建議你從一個稍微不同的角度的問題...

我的意思是,如果你問

"what's the maximum number of threads I can create and use for task x?" 

和你問的是,因爲你認爲最螺紋用越好,你可以改爲問

"how many threads would I need to complete x most efficiently?" 

例如,不太可能在任何雙核心機器上,數千個線程的性能會更好。例如,作爲一般的指導,對於CPU密集型任務(其中排序算法可能是),線程的最佳數量是

threads = number of CPUs + 1 

看到How to find out the optimal amount of threads?

線程的實際最大數量取決於在OS上與JVM以及配置多少內存在JVM中使用。創建一個新線程需要一些操作系統內存,但不是Java堆內存。這意味着,如果您創建了數千個線程,則可能會耗盡內存,而使用-Xmx時無法啓動。實際上,您分配的Java堆內存越少,可用的本地內存就越多,因此可創建的線程越多。

請參閱this article以及評論以瞭解如何使用筆和紙製定最大值。儘管如此,如果要在應用程序中使用無限數量的線程,可以使用'Executors.newCachedThreadPool()',它將創建一個線程池,並根據需要創建多個線程。我不建議在日常使用中使用此類池,但它與您的原始問題有關。

希望有所幫助。