(这是Paul)
除了幽默的措辞外,幻灯片的意图是,正如您提到的那样,线程池无限增长并创建新线程。
线程池固有地表示系统内工作的队列和传输点。也就是说,有些东西正在为它提供工作(它也可能在其他地方提供工作)。如果线程池开始增长,那是因为它无法满足需求。
一般来说,由于计算机资源是有限的,队列是建立用来处理工作的突发情况的。然而,该线程池不能使你能够控制瓶颈的推进。
例如,在服务器场景中,几个线程可能正在接受套接字并将客户端交给线程池进行处理。如果线程池开始失控,则系统应停止接受新客户端(实际上,“接受器”线程通常暂时跳入线程池以帮助处理客户机)。
如果您使用具有无限输入队列的固定线程池,则效果类似。任何时候考虑队列失控的情况 - 您就会意识到问题所在。
我记得Matt Welsh的开创性SEDA服务器(异步)创建了可以根据服务器特性修改其大小的线程池。
停止接受新客户端的想法听起来很糟糕,直到您意识到另一种选择是处理零个客户端的瘫痪系统。 (再次强调,计算机是有限的-即使是经过优化的系统也有极限)
顺便说一下,JVM将线程限制为16k(通常)或32k线程,具体取决于JVM。但是,如果您受制于CPU,则该限制并不是很相关-在CPU限制的系统上启动另一个线程是适得其反的。
我曾经快乐地运行过拥有4或5千个线程的系统。但是靠近16k的限制时,事情往往会变得混乱不堪(这是JVM强制执行的-即使在非CPU限制的情况下,在Linux C ++中我们有更多的线程)。
Executors.newCacheThreadPool()
方法的问题在于,执行器将创建并启动尽可能多的线程来执行提交给它的任务。虽然已完成的线程会被释放(阈值是可配置的),但这确实可能导致严重的资源匮乏,甚至崩溃JVM(或一些设计不良的操作系统)。