嗯,很多。
这里有几个参数。特定的VM,加上VM上通常也有运行时参数。这在某种程度上是由操作系统驱动的:底层操作系统对线程有什么支持,对它们有哪些限制?如果VM实际上使用OS级别的线程,那么好的老红线程/绿线程就是这样的。
“支持”的含义是另一个问题。如果您编写的Java程序就像class DieLikeADog {
public static void main(String[] argv){
for(;;){
new Thread(new SomeRunaable).start();
}
}
}
(不要抱怨一些语法细节,我正在喝第一杯咖啡),那么你肯定会看到成百上千的线程在运行。但创造线程的开销相对较高,调度程序的开销可能会越来越大;还不清楚是否可以让这些线程做任何有用的事情。
更新
好吧,忍不住了。这是我的小测试程序,有几个装饰:public class DieLikeADog {
private static Object s = new Object();
private static int count = 0;
public static void main(String[] argv){
for(;;){
new Thread(new Runnable(){
public void run(){
synchronized(s){
count += 1;
System.err.println("New thread #"+count);
}
for(;;){
try {
Thread.sleep(1000);
} catch (Exception e){
System.err.println(e);
}
}
}
}).start();
}
}}
基于Intel的OS/X10.5.6和Java65(见评论),这是我得到的New thread #2547
New thread #2548
New thread #2549
Can't create thread: 5
New thread #2550
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:592)
at DieLikeADog.main(DieLikeADog.java:6)