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

Rya*_*nqy 7 java multithreading cpu-time threadpoolexecutor

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

Executors.newFixedThreadPool(4);
Run Code Online (Sandbox Code Playgroud)

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

Riv*_*ver 5

不,这些线程是延迟创建的,或者是“按需”创建的。如文档中所述(强调我的):

按需施工

默认情况下,即使是核心线程也仅在新任务到达时才最初创建和启动

Java 提供了方法来覆盖此默认值并允许急切创建,即prestartCoreThreadprestartAllCoreThreads


一旦实际创建了线程,空闲线程(通常)将不会占用 CPU 时间,因为当它们没有工作可做时,没有理由将它们调度到内核上。

然而,他们仍然会保留一些内存,用于堆栈等。


Gho*_*ica 4

javadoc指出

创建一个线程池,该线程池重用在共享无界队列上运行的固定数量的线程。在任何时候,最多 nThreads 个线程将处于活动处理任务状态。

这可能会导致假设:我们并不确切知道。但正如另一个答案清楚地发现的那样 - 我们可以知道,实现实际上是完全惰性的。因此:

 ExecutorService service = Executors.newFixedThreadPool(4);
Run Code Online (Sandbox Code Playgroud)

甚至不会引起大量的设置。该实施可以自由等待任何

 service.submit(...
Run Code Online (Sandbox Code Playgroud)

即将发生。

另一方面,该线程池(理论上)可以立即创建,并且还可以创建 4 个操作系统线程。如果是后者,所有这些线程都将处于空闲状态,因此它们不应该任何 CPU 资源。

当然,正如 Elliott 正确指出的那样,创建池和(可能)创建 1 到 4 个线程的初始步骤需要 CPU 活动。

当然:线程是操作系统资源。因此,即使它们“仅存在”并且什么也不做;他们有这个“成本”。同样,这可能取决于操作系统是否会变成问题(例如达到某些“现有线程的最大数量”限制)。

最后:这让我感到好奇,我查看了当前的 Java8 源代码(从newFixedThreadPoo()ThreadPoolExcecutor()DefaultThreadFactory)。如果我没记错的话:这些构造函数只为线程创建做准备

所以:“当前”实现是“完全”惰性的;如果你真的只调用newFixedThreadPool()而不使用生成的 ExecutorService ...什么也不会发生(就创建的新线程而言)。