2017-05-05 180 views
3

当我有这个代码的应用程序:空闲线程在Java执行程序中执行CPU执行时间吗?

Executors.newFixedThreadPool(4); 

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

+7

不是。空闲线程不消耗CPU时间(尽管启动池需要一定的时间,并且会消耗内存)。 –

+0

@ElliottFrisch如果我没有弄错,调用这个方法不会真的**启动池。看到我的答案。 – GhostCat

+0

只是想知道:有什么东西阻止你接受答案吗? – GhostCat

回答

2

javadoc状态:

创建一个可重用不受限制的队列操作螺纹固定数量的线程池。在任何时候,最多nThreads线程都将被激活处理任务。

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

ExecutorService service = Executors.newFixedThreadPool(4); 

甚至不会导致很多设置。实施可以自由地等待任何发生。

service.submit(... 

发生。

另一方面,该线程池可能(理论上)立即创建,并且还可以创建4个OS线程。如果后面是这种情况,那么所有这些线程都会闲置,因此它们应该消耗任何CPU资源,而不是而不是。当然,正如Elliott正确指出的那样,创建池和(可能)创建1到4个线程的初始步骤需要CPU活动。

当然:线程是操作系统资源。所以即使他们“只存在”也什么都不做;他们有这个“成本”。再次,它可能依赖于操作系统,如果这可能会变成一个问题(如达到一些“最大数量的现有线程”限制)。

最后:因为这让我好奇,我看了一下当前的Java8源代码(从newFixedThreadPoo()ThreadPoolExcecutor()下降到DefaultThreadFactory)。如果我没有弄错:那些构造函数只有准备线程创建。

因此:“当前”实现是“完全”懒惰;如果你真的只打电话newFixedThreadPool()而不使用生成的ExecutorService ... 没有发生(根据创建的新线程)。

1

不,这些线程是懒惰创建的,或者是“按需”。作为the documentation(重点矿山)说:

点播建设

默认情况下,即使核心线程最初创建和启动只有当新的任务到达

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


一旦线程被实际创建,空闲的人(通常)不会占用CPU时间,没有理由让他们在核心调度时,他们没有工作要做。

但是,他们仍然会坚持一些内存,因为他们的堆栈和内存不足。