在应用程序生命周期内创建的线程池的最大数量是否有限制?
考虑以下代码:
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();
}
}
}
在应用程序的生命周期中可以有多少个线程池(不是同时)是否有限制。
我尝试查看源代码并运行此测试一段时间,但似乎没有限制。一旦线程池计数器溢出会发生什么?
回答
(在 Java 11 中)对线程池的数量没有特定限制,并且没有可能溢出的线程池计数器。
线程有一个 ID / 序列号,但由于它的类型是,long并且在Thread创建新线程时只会增加 1 ,因此溢出不是实际问题1。
但是,线程……尤其是活动线程2 ……使用大量内存。因此,您不能同时存在无限数量的活动线程或线程池。
1 - 做数学。应用程序创建 2^63 个线程需要多长时间...假设有足够的内存等。
2 - 已启动但尚未终止的线程。