在应用程序生命周期内创建的线程池的最大数量是否有限制?
Is there a limit on the maximum number of threadpools created during an application lifetime?
考虑以下代码:
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();
}
}
}
在应用程序的生命周期内(不是同时)可以有多少个线程池有限制吗?
我尝试查看源代码和 运行 这个测试有一段时间了,但似乎没有限制。一旦线程池计数器溢出会发生什么?
没有限制。但是线程占用自己的资源。因此,这取决于服务器中有多少资源(CPU、内存等)可用以及分配给 JVM 的资源有多少。如果线程数吃光了所有资源,你的JVM就会崩溃。
(在Java11中)线程池的数量没有具体的限制,也没有可能溢出的线程池计数器。
线程有一个 ID / 序列号,但由于它的类型是 long
并且它只在创建新的 Thread
时递增 1,溢出不是一个实际问题1.
但是,线程...尤其是 live 线程2 ... 使用大量内存。所以你不能同时存在无限数量的活动线程或线程池。
1 - 计算一下。应用程序创建 2^63 个线程需要多长时间...假设有足够的内存等
2 - 已启动但尚未终止的线程。
考虑以下代码:
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();
}
}
}
在应用程序的生命周期内(不是同时)可以有多少个线程池有限制吗?
我尝试查看源代码和 运行 这个测试有一段时间了,但似乎没有限制。一旦线程池计数器溢出会发生什么?
没有限制。但是线程占用自己的资源。因此,这取决于服务器中有多少资源(CPU、内存等)可用以及分配给 JVM 的资源有多少。如果线程数吃光了所有资源,你的JVM就会崩溃。
(在Java11中)线程池的数量没有具体的限制,也没有可能溢出的线程池计数器。
线程有一个 ID / 序列号,但由于它的类型是 long
并且它只在创建新的 Thread
时递增 1,溢出不是一个实际问题1.
但是,线程...尤其是 live 线程2 ... 使用大量内存。所以你不能同时存在无限数量的活动线程或线程池。
1 - 计算一下。应用程序创建 2^63 个线程需要多长时间...假设有足够的内存等
2 - 已启动但尚未终止的线程。