我正在尝试对可以在单个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多秒。
我在这里做错了吗?
答案 0 :(得分:5)
在没有做任何其他事情的情况下从0到100000计数是如此之快(甚至可能被Hotspot完全删除,将run()
方法减少为noop),你将永远不会有大量的并发线程:它需要更多的时间来启动新线程,而不是线程完成和死亡。
为什么不让你的所有线程永远睡觉?这将保证他们全部开始。
答案 1 :(得分:1)
我在这里做错了吗?
不,我不这么认为,虽然这取决于你想要完成的事情。
我看到的唯一问题是你的工作循环将在非常的时间内完成。您的计划所花费的时间主要用于Thread
创作,而不是其他任何事情。
// this is going to take a couple ns at most
for (int i = 0; i < 100000; i++)
;
我显着增加了每个线程的工作量,看看它是否更符合您的预期。
一旦你增加了每个线程正在做的工作量,你很快就会发现你很可能用完线程的堆栈空间内存或一些操作系统限制很长时间才能分配100万个线程。