【发布时间】:2011-05-18 16:27:30
【问题描述】:
我想确定我可以为我的排序算法创建的最大线程数。我想为此使用 java.lang.Runtime。
我想统计当前线程数量,达到限制时停止创建新线程。
【问题讨论】:
-
你想使用
java.lang.Runtime的哪些线索?
标签: java multithreading
我想确定我可以为我的排序算法创建的最大线程数。我想为此使用 java.lang.Runtime。
我想统计当前线程数量,达到限制时停止创建新线程。
【问题讨论】:
java.lang.Runtime的哪些线索?
标签: java multithreading
JVM 的最大线程数通常为数千。如果您使用多个线程来优化计算算法,那么您实际上并不需要超过运行系统中处理器的数量。使用Runtime.getRuntime().availableProcessors() 查找。
【讨论】:
我建议你从稍微不同的角度来看待这个问题......
我的意思是,如果你问
"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()' 来创建线程池,创建所需数量的线程。我不建议将这种类型的池用于日常使用,但这与您最初的问题有关。
希望对您有所帮助。
【讨论】:
您可以通过将visualvm 附加到您的进程来查看您有多少线程。我推荐下载所有插件的 1.3.2 版本。
我还建议使用 Spring 及其 Executor 池。这是能够配置线程池大小的好方法。
【讨论】: