问:
1)在多线程应用程序中,应用程序可以产生多少线程是有限制的。
2)如果存在这样的限制,JVM 是否终止应用程序以及错误代码是什么。
编辑
3)如果应用程序以非常快的速度生成,JVM 是否会将其检测为“粗糙”应用程序
提前致谢
问:
1)在多线程应用程序中,应用程序可以产生多少线程是有限制的。
2)如果存在这样的限制,JVM 是否终止应用程序以及错误代码是什么。
编辑
3)如果应用程序以非常快的速度生成,JVM 是否会将其检测为“粗糙”应用程序
提前致谢
您应该针对您的设置对其进行测试。我为我的:
import static java.lang.Thread.currentThread;
import java.util.concurrent.CountDownLatch;
public class Test {
static final Thread t = currentThread();
public static void main(String[] args) throws Exception {
int i = 0;
try {
while (true) {
final CountDownLatch l = new CountDownLatch(1);
new Thread() { public void run() { l.countDown(); park(); }}.start();
l.await();
i++;
}
} finally { System.out.println("Started " + i + " threads."); }
}
private static void park() {
try { t.join(); } catch (InterruptedException e) {
System.out.println("Unparked");
}
}
}
输出:
Started 2030 threads.
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:658)
at test.Test.main(Test.java:10)
JVM 规范没有指定限制。操作系统可能(可能)像往常一样限制每个进程等。每个线程还将分配一个堆栈等,因此可能需要大量内存,因此取决于计算机首先达到的限制..
请注意:过多的线程通常是低效的。您的程序可以/应该以另一种方式更好地扩展。根据您的需要使用线程池(执行器服务)、异步 I/O、fork/join 等。
也可以看看:
一个应用程序在被 JVM 终止之前可以生成多少个线程
这个问题是基于一个错误的前提。当 JVM 无法创建新线程时,它只会向试图创建额外线程的代码抛出异常。该应用程序没有“被 JVM 终止”。
归结为你对我感觉的每个单独线程做了多少。您可以使用环境变量为 JVM 提供资源,所以我想有很多。并且错误代码很可能是 OutOfMemoryException,Heap Space 问题。
它还归结为您是制作手动线程还是使用线程池。每次制作手动线程时,都需要一个核心。线程池没有。