Rya*_*nqy 7 java multithreading cpu-time threadpoolexecutor
当我在应用程序中有此代码时:
Executors.newFixedThreadPool(4);
Run Code Online (Sandbox Code Playgroud)
但我从不使用这个线程池。空闲线程会消耗 CPU 时间吗?如果是这样 - 为什么?
不,这些线程是延迟创建的,或者是“按需”创建的。如文档中所述(强调我的):
按需施工
默认情况下,即使是核心线程也仅在新任务到达时才最初创建和启动
Java 提供了方法来覆盖此默认值并允许急切创建,即prestartCoreThread和prestartAllCoreThreads。
一旦实际创建了线程,空闲线程(通常)将不会占用 CPU 时间,因为当它们没有工作可做时,没有理由将它们调度到内核上。
然而,他们仍然会保留一些内存,用于堆栈等。
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 ...什么也不会发生(就创建的新线程而言)。