java - 如何更改 ScheduledExecutorService 中的线程池大小?
问题描述
我需要带有动态线程池的 ScheduledExecutorService。我想动态更改线程池大小。我怎样才能做到这一点?
class ExecutorTask {
private ScheduledExecutorService service;
public void add(Task task) {
// I need thread pool size == count added tasks.
service.scheduleAtFixedRate(this::start, 0, 10, TimeUnit.SECONDS);
}
}
也许你可以建议我另一个线程池?
解决方案
您可以使用ScheduledThreadPoolExecutor轻松做到这一点。
//Init executor
int initialPoolSize = 5;
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(initialPoolSize);
//[...] do something
//Change max size
int newPoolSize = 10;
executor.setCorePoolSize(newPoolSize);
请注意,继承的方法setMaximumPoolSize(int)对ScheduledThreadPoolExecutor 没有影响。要更改池大小,您需要更改 corePoolSize:
虽然这个类继承自 ThreadPoolExecutor,但一些继承的调优方法对它没有用。特别是,因为它充当使用 corePoolSize 线程和无界队列的固定大小的池,所以对 maximumPoolSize 的调整没有有用的效果。 此外,将 corePoolSize 设置为零或使用 allowCoreThreadTimeOut 几乎不是一个好主意,因为这可能会使池没有线程来处理任务,一旦它们有资格运行。
推荐阅读
- chromakey - Openshot 色度键功能无法可靠工作
- php - 有没有办法在 curl_setopt url 中包含 php 变量?
- python - 如何在 admin.py 中将 Django import_export 与 list_display 结合使用?
- python - Pyomo 优化投资/收入
- html-select - 选择选项的文本换行是可能的
- reactjs - 获取未捕获的语法错误:提供 React 构建时出现意外的令牌“<”
- c++ - Qt Creator - “无法创建文件:未知错误”
- html - Flex 一个接一个地阻塞
- linux - “gcc 已散列(/bin/gcc)”是什么意思?
- javascript - 在传单中查找用户位置并将其设置在地图上