FixedThreadPool空闲时会消耗CPU资源吗?

ava FixedThreadPool 当空闲的时候会释放掉线程吗?如果不会,哪个线程池是既可以限定大小,又可以自动释放资源的?
https://www.oschina.net/quest...

阅读 4.1k
2 个回答

newFixed不会释放,你看他的参数:

ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

corePoolSizemaximumPoolSize相等,所以无法“扩容”,更不能释放了。

线程池的释放,或者叫“缩容”,是指从maximumPoolSize 缩容到 corePoolSize

哪个线程池是既可以限定大小,又可以自动释放资源的?

Executors 接口没提供这个选项,但你可以自己 new :

return new ThreadPoolExecutor(20, 40,
                                      60L, TimeUnit.MILLISECONDS,
                                      new SynchronousQueue<Runnable>());

解释下参数:核心20,即最小会释放到20,最大40,达到40后如果空闲会按60L的最大空闲时间释放空闲线程。

附一张线程池核心流程图

image.png

不会
自己 new 线程池,coreSize0 就可以了
比如下面这样,就是最小0,最大100的线程池,线程空闲30秒就会释放

new ThreadPoolExecutor(0, 100, 30, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题