我正在尝试对可以在单个JVM上运行的并发线程的最大数量和创建大量线程所需的时间运行一个小测试。我有以下简单的代码
public class Threading {
public static void main(String[] args) {
Runnable task = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100000; i++)
;
}
};
long start = System.nanoTime();
int runs = 1000000;
for (int i = 0; i < runs; i++)
new Thread(task).start();
long time = System.nanoTime() - start;
System.out.printf("Time for task to complete: %.2f seconds", (double) time / 1000000000.0);
}
}我使用VisualVM来跟踪活动线程的数量。
我得到的结果似乎很奇怪。我达到的峰值活动线程数约为100个,平均活动线程数约为15个。创建这100万个线程所需的时间超过60秒。

我做错什么了吗?
发布于 2013-04-09 19:57:48
在不做其他任何事情的情况下从0数到100000是如此之快(甚至可能被Hotspot完全删除,将run()方法减少到noop),以至于您永远不会有大量的并发线程:启动一个新线程所需的时间比线程完成和终止所需的时间还要多。
为什么不让所有的线程永远休眠呢?这将保证它们都已启动。
发布于 2013-04-09 19:57:22
我做错什么了吗?
不,我不这么认为,尽管这取决于你试图实现的目标。
我看到的唯一问题是,您的工作循环将在很短的时间内完成。你的程序所花费的时间主要花在创建Thread上,而不是其他事情。
// this is going to take a couple ns at most
for (int i = 0; i < 100000; i++)
;我会显着增加每个线程的工作量,看看这是否更符合您的预期。
一旦您增加了每个线程所做的工作量,您很快就会发现,在您能够派生100万个线程之前,很可能会耗尽线程的堆栈空间内存或某些操作系统限制。
https://stackoverflow.com/questions/15901141
复制相似问题