在应用程序生命周期内创建的线程池的最大数量是否有限制?

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 - 已启动但尚未终止的线程。