我需要带有动态线程池的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);
}
}
也许您可以建议我另一个线程池?
答案 0 :(得分:1)
您可以使用ScheduledThreadPoolExecutor轻松地做到这一点。
//Init executor
int initialPoolSize = 5;
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(initialPoolSize);
//[...] do something
//Change max size
int newPoolSize = 10;
executor.setCorePoolSize(newPoolSize);
请注意,继承的方法setMaximumPoolSize(int)具有no effect on ScheduledThreadPoolExecutor。要更改池大小,您需要更改corePoolSize:
尽管此类从ThreadPoolExecutor继承,但其中一些 继承的调整方法对此没有用。 尤其是因为 它使用corePoolSize线程和一个固定大小的池 无限制的队列,对maximumPoolSize的调整没有任何作用。 此外,将corePoolSize设置为 零或使用allowCoreThreadTimeOut,因为这可能会离开池 一旦任务有资格运行,就没有线程来处理任务。
答案 1 :(得分:0)
也许这是您在Executors Util类中寻找的东西:
ExecutorService executorService = Executors.newScheduledThreadPool(5)
答案 2 :(得分:0)
您可以使用setCorePoolSize(int)
方法。
还使用Executors.newCachedThreadPool
来为ThreadPoolExecutor
创建线程池大小。
ThreadPoolExecutor
根据需要创建新线程来执行新任务,并与Executors.newCachedThreadPool()
重复使用现有线程