当我在应用程序中有这段代码时:
Executors.newFixedThreadPool(4);
但我从未使用过这个线程池。空闲的线程会消耗CPU时间吗?如果会,为什么?
Executors.newFixedThreadPool(4);
但我从未使用过这个线程池。空闲的线程会消耗CPU时间吗?如果会,为什么?
Java提供了覆盖此默认设置并允许急切创建的方法,即按需构建
默认情况下,即使是核心线程也仅在有新任务到达时才会被创建和启动。
prestartCoreThread
和prestartAllCoreThreads
。javadoc中写道:
创建一个线程池,它重用一定数量的线程,这些线程从共享的无界队列中操作。在任何时候,最多nThreads个线程将活动地处理任务。
这可能会导致我们做出假设:我们不确定。但是正如其他答案清楚地发现的那样 - 我们可以知道,并且实现实际上完全懒惰。因此:
ExecutorService service = Executors.newFixedThreadPool(4);
这甚至不需要太多的设置。实现可以自由等待任何
service.submit(...
最后:由于这让我很好奇,我查看了当前Java8源代码(从newFixedThreadPoo()和ThreadPoolExcecutor()到DefaultThreadFactory)。如果我没有错的话:这些构造函数仅为线程创建做准备。
因此,“当前”实现是“完全”的惰性;如果您真的只调用newFixedThreadPool()
而从未使用生成的ExecutorService……则不会发生任何事情(就新线程创建而言)。