【发布时间】:2011-02-21 12:27:13
【问题描述】:
我想在 Java 中同时生成 200 个线程。我现在正在做的是进入一个循环并创建 200 个线程并启动它们。完成这 200 个线程后,我想再生成 200 个线程集,依此类推。
这里的要点是,我生成的前 200 个线程需要在生成下一组之前完成。我尝试了下面的代码,但它不起作用
for(int i=0;i<200;i++){
Thread myThread = new Thread(runnableInstance);
myThread.start();
}
for(int i=0;i<200;i++){
Thread myThread = new Thread(runnableInstance);
myThread.start();
}
注意:我有意将 for 循环放了两次,但我想要的效果并没有发生,因为第二个 for 循环是在第一组线程结束执行之前执行的。
请指教
【问题讨论】:
-
我真的希望您将 200 用作“非常大的数字”的示例。我能想到的任务很少会使用 200 个相同的线程。
-
小心,200 个线程已经接近在某些版本的 Linux 上可以生成的限制。您应该能够在 Windows 上生成更接近 2000 的值。 (通过反复试验找到这两个值)。当我对不同设备进行大量同步 SNMP 获取时,我必须这样做——CPU 可以轻松处理一千个未完成的请求。然而,一旦 NIO 出现,异步显然是一个更好的选择,并且可以扩展得更高。
-
@Bill K:Linux/Java 有哪些版本,为什么会这样?您是在谈论上世纪的 1.3 Java VM 吗? Linux 上的 AFAIK Java 多年来一直使用 NPTL,并且 Linux 已被证明能够在不到两秒的时间内扩展到 100 000 个 NTPL 线程。现在可能存在内核或 glibc 限制(如果我没记错的话,默认为 1024),但是用更高的值重新编译是微不足道的。除非你给出更详细的解释,否则我称之为 FUD。 java.sun.com/developer/technicalArticles/JavaTechandLinux/…
-
@Bill K:刚刚在我的 Linux 工作站上尝试过:默认情况下,无需更改任何参数,我可以启动近 4000 个 Java 线程。一个微不足道的重新编译,我会把那个数字放在 5 位数字中(哎呀,在我的普通工作站上甚至可能是 6 位)。所以,是的,我真的称之为“200 个线程相当接近你可以在某些版本的 Linux 上产生的限制” FUDdy 充其量。需要解释,因为您肯定不是在谈论那里的“常规”Linuxes/JVM。我很难考虑不支持超过 200 个 NPTL 的 Linux 版本。
-
@WizardOfOdds 好东西,谢谢。当我尝试这个时,它是在大约 199x 或 2000 年代初期的 Red Hat Linux 上,所以也许事情已经改变了。我撤销了我的警告 :) 然而值得注意的是,这是有限制的,它取决于操作系统和操作系统配置。此外,我倾向于考虑大约 1/2 的线程我可以启动“极限”,因为在那之后回收有时不够快,有时我因此无法创建新线程。所以windows实际上更接近4k,而linux更接近400......
标签: java multithreading