考虑以下代码:
class Test {
public static void main(String... args) {
var t = new Test();
while(true) {
t.work();
}
}
public void work() {
ExecutorService executorService = Executors.newFixedThreadPool(10);
try {
/* Do work */
}
finally {
executorService.shutdown();
}
}
}
在应用程序的生存期内(不是同时)可以有多少线程池是有限制的。
我试着查看源代码,并运行了一段时间的测试,但似乎没有限制。一旦线程池计数器溢出,会发生什么?
2条答案
按热度按时间r6hnlfcb1#
(在Java11中)线程池的数量没有特定的限制,也没有可能溢出的线程池计数器。
线程有一个id/序列号,但由于其类型是
long
当一个新的Thread
溢出不是一个实际的问题。但是,线程。。。尤其是活丝2。。。使用大量内存。因此,不能同时存在无限数量的活动线程或线程池。
1-算算。一个应用程序创建2^63个线程需要多长时间。。。假设有足够的内存等。
2-已启动但尚未终止的线程。
up9lanfz2#
没有限制。但是线程占用自己的资源。因此,问题在于服务器中有多少资源(cpu、内存等)可用&有多少资源分配给jvm。如果线程数耗尽了所有资源,jvm将崩溃。