如何确定Java-VM中可用的最大线程数?

时间:2011-05-07 22:10:34

标签: java multithreading

我想确定我能为我的排序算法创建的最大线程数。我想使用 java.lang.Runtime

我想计算当前线程数量,并在达到限制时停止创建新线程。

3 个答案:

答案 0 :(得分:10)

JVM的最大线程数通常在几千个。如果您使用多个线程来优化计算算法,那么您实际上并不需要超过其运行的系统中的处理器数量。使用Runtime.getRuntime().availableProcessors()查找。

答案 1 :(得分: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?"

非常 不太可能使任务x在双核机器上的数千个线程中表现更好。作为一般指南,例如,对于CPU绑定任务(可能是排序算法),最佳线程数是

threads = number of CPUs + 1

请参阅How to find out the optimal amount of threads?

实际的最大线程数取决于操作系统和JVM以及配置在JVM中使用的内存量。创建一个新线程需要一些操作系统内存,而不是Java的堆内存。这意味着如果您创建了数千个线程,则可能会耗尽内存,而使用-Xmx无法提升。实际上,您分配的Java堆内存越少,可用的本机内存就越多,因此您可以创建的线程越多。

请参阅this article和评论,了解如何用笔和纸计算出最大值。

说了这么多,如果你想在你的应用程序中使用无限数量的线程,你可以使用`Executors.newCachedThreadPool()'来创建一个线程池,创建所需数量的线程。我不建议在日常使用中使用此类型的池,但它与您的原始问题相关。

希望有所帮助。

答案 2 :(得分:0)

通过将visualvm附加到您的流程,您可以查看有多少个主题。我建议下载所有插件的版本1.3.2。

我还建议使用Spring及其Executor池。这是一种能够配置线程池大小的好方法。