空闲线程是否在Java Executors中占用CPU执行时间?

时间:2017-05-05 02:29:34

标签: java multithreading threadpoolexecutor cpu-time

当我在应用程序中使用此代码时:

Executors.newFixedThreadPool(4);

但我从不使用此线程池。空闲线程会消耗CPU时间吗?如果是这样 - 为什么?

2 个答案:

答案 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提供了覆盖此默认值并允许热切创建的方法,即prestartCoreThreadprestartAllCoreThreads

一旦实际创建了线程,空闲的线程(通常)就不会占用CPU时间,因为当它们没有工作要做时,没有理由在核心上安排它们。

然而,他们仍会保留一些记忆,因为他们的筹码等等。