ScheduledExecutorService 具有最小和最大线程数



我正在尝试使用ScheduledExecutiorService来调度给定线程池上的任务。

public ScheduledExecutorService scheduledExecutorService() {
return Executors.newScheduledThreadPool(3);
}

看起来,这种创建实例的方式假定用户指定的值为最小线程数,最大线程数为Integer.MAX_VALUE(默认值(。

如何指定ScheduledExecutiorService实例的最大线程数?我无法将如此大量的线程分配为最大线程数。

来自反编译jar的序列中的代码片段-

// From Executors.java
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
// From ScheduledThreadPoolExecutor.java
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE,
DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
new DelayedWorkQueue());
}
// From ThreadPoolExecutor.java
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}

如果我错过了在Java文档中引用一个方法,请给我指正确的位置。TIA。

ScheduledThreadPoolExecutorConstructor不直接提供此参数的设置。您可以手动调用setMaximumPoolSize方法:

public ScheduledExecutorService scheduledExecutorService() {
ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(corePoolSize);
scheduledThreadPoolExecutor.setMaximumPoolSize(xxx);
return scheduledThreadPoolExecutor;
}

但是在ScheduledThreadPoolExecutor中设置这个maximumPoolSize是没有意义的,这就是构造函数不声明这个参数的原因

来自ScheduledThreadPoolExecutor:的Java文档

虽然这个类继承自ThreadPoolExecutitor,但一些继承的调优方法对它没有用处。特别是,因为它使用corePoolSize线程和无边界队列作为固定大小的池,所以对maximumPoolSize的调整没有用。此外,将corePoolSize设置为零或使用allowCoreThreadTimeOut几乎从来都不是一个好主意,因为一旦任务有资格运行,这可能会使池中没有线程来处理任务。

更多详细信息,请参阅ScheduledThreadPoolExecutor中的delayedExecuteensurePrestartmaximumPoolSize是无用的。

private void delayedExecute(RunnableScheduledFuture<?> task) {
if (isShutdown())
reject(task);
else {
// add task to queue
super.getQueue().add(task);
if (isShutdown() &&
!canRunInCurrentRunState(task.isPeriodic()) &&
remove(task))
task.cancel(false);
else
ensurePrestart();
}
}
void ensurePrestart() {
int wc = workerCountOf(ctl.get());
if (wc < corePoolSize)
addWorker(null, true);
else if (wc == 0)
addWorker(null, false);
}

最新更新