当我在应用程序中使用此代码时:
Executors.newFixedThreadPool(4);
但我从不使用此线程池。空闲线程会消耗CPU时间吗?如果是这样 - 为什么?
答案 0 :(得分:4)
javadoc州:
创建一个线程池,该线程池重用在共享无界队列中运行的固定数量的线程。在任何时候,最多nThreads线程将是活动的处理任务。
这可能会导致假设:我们并不确切知道。但正如另一个答案清楚地发现 - 我们可以知道,实施实际上是完全懒惰的。因此:
ExecutorService service = Executors.newFixedThreadPool(4);
甚至没有引起很多设置。实施可以自由等待任何
service.submit(...
发生了。
另一方面,该线程池可以<理论上>立即创建,并且还可以创建4个OS线程。如果是后一种情况,所有这些线程都将处于空闲状态,因此它们不消耗任何CPU资源。
但是,当然,正如Elliott正确地指出的那样,创建池和(可能)创建1到4个线程的初始步骤需要CPU活动。
当然: threads 是一个OS资源。即使他们“只存在”而什么也不做;他们有“成本”。同样,它可能依赖于操作系统,如果它可能变成一个问题(如达到一些“现有线程的最大数量”限制)。
最后:因为这让我很好奇,我查看了当前的Java8源代码(从newFixedThreadPoo()和ThreadPoolExcecutor()到DefaultThreadFactory)。如果我没有弄错的话:那些构造函数只能准备来创建线程。
所以:“当前”实现是“完全”懒惰的;如果你真的只调用newFixedThreadPool()
而没有使用生成的ExecutorService ... 没有发生(就创建新线程而言)。
答案 1 :(得分:3)
不,这些线程是懒惰地创建的,或者是“按需”。如the documentation中所述(强调我的):
按需建设
默认情况下,即使核心线程最初只在新任务到达时创建并启动
Java提供了覆盖此默认值并允许热切创建的方法,即prestartCoreThread
和prestartAllCoreThreads
。
一旦实际创建了线程,空闲的线程(通常)就不会占用CPU时间,因为当它们没有工作要做时,没有理由在核心上安排它们。
然而,他们仍会保留一些记忆,因为他们的筹码等等。