我在fixedThreadPool中调用了10个线程的外部API。现在我想动态减少这个线程数,因为API主机无法处理10个线程中的那些请求。我想将线程数减少到5.我希望在没有应用程序重启的情况下执行此操作,即 我想动态更改为固定大小的线程池的大小。我可以在ThreadPoolExecutor上调用setCorePoolSize(int)和setMaximumPoolSize(int)。然而,javadoc说:
设置核心线程数。这将覆盖构造函数中设置的任何值。如果新值小于当前值,则当下一个空闲时,多余的现有线程将被终止。如果需要更大,则可以启动新线程来执行任何排队任务。
所以当他们说: “多余的现有线程将在下一次变为空闲时终止” ,当多余的现有线程将变为空闲时?如果我的任务队列总是满的,这些多余的现有线程是否可以空闲?
答案 0 :(得分:5)
现在我想动态减少这个线程数,因为API主机无法处理10个线程中的那些请求。
在这种情况下,我建议从一开始就将线程数设置为5。如果你不能这样做,你可以将每个任务包装在一个信号量中,这样你就可以限制并发任务的数量。
当多余的现有线程变为空闲时?
当他们没有执行一段时间的任务时(默认为一分钟)
如果我的任务队列总是满的,这些多余的现有线程是否可以空闲?
没有。它取决于线程池的设置,即线程何时退役,但默认值为1分钟。