提交 e8c0ef83 编写于 作者: J Juergen Hoeller

ThreadPoolTaskScheduler allows for setPoolSize changes at runtime

Also exposing "getPoolSize()" and "getActiveCount()" from ThreadPoolTaskScheduler now, analogous to ThreadPoolTaskExecutor.

Issue: SPR-10883
上级 e5231526
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -154,9 +154,7 @@ public class ThreadPoolTaskExecutor extends ExecutorConfigurationSupport impleme ...@@ -154,9 +154,7 @@ public class ThreadPoolTaskExecutor extends ExecutorConfigurationSupport impleme
* Specify whether to allow core threads to time out. This enables dynamic * Specify whether to allow core threads to time out. This enables dynamic
* growing and shrinking even in combination with a non-zero queue (since * growing and shrinking even in combination with a non-zero queue (since
* the max pool size will only grow once the queue is full). * the max pool size will only grow once the queue is full).
* <p>Default is "false". Note that this feature is only available on Java 6 * <p>Default is "false".
* or above. On Java 5, consider switching to the backport-concurrent
* version of ThreadPoolTaskExecutor which also supports this feature.
* @see java.util.concurrent.ThreadPoolExecutor#allowCoreThreadTimeOut(boolean) * @see java.util.concurrent.ThreadPoolExecutor#allowCoreThreadTimeOut(boolean)
*/ */
public void setAllowCoreThreadTimeOut(boolean allowCoreThreadTimeOut) { public void setAllowCoreThreadTimeOut(boolean allowCoreThreadTimeOut) {
...@@ -225,7 +223,11 @@ public class ThreadPoolTaskExecutor extends ExecutorConfigurationSupport impleme ...@@ -225,7 +223,11 @@ public class ThreadPoolTaskExecutor extends ExecutorConfigurationSupport impleme
* @see java.util.concurrent.ThreadPoolExecutor#getPoolSize() * @see java.util.concurrent.ThreadPoolExecutor#getPoolSize()
*/ */
public int getPoolSize() { public int getPoolSize() {
return getThreadPoolExecutor().getPoolSize(); if (this.threadPoolExecutor == null) {
// Not initialized yet: assume core pool size.
return this.corePoolSize;
}
return this.threadPoolExecutor.getPoolSize();
} }
/** /**
...@@ -233,7 +235,11 @@ public class ThreadPoolTaskExecutor extends ExecutorConfigurationSupport impleme ...@@ -233,7 +235,11 @@ public class ThreadPoolTaskExecutor extends ExecutorConfigurationSupport impleme
* @see java.util.concurrent.ThreadPoolExecutor#getActiveCount() * @see java.util.concurrent.ThreadPoolExecutor#getActiveCount()
*/ */
public int getActiveCount() { public int getActiveCount() {
return getThreadPoolExecutor().getActiveCount(); if (this.threadPoolExecutor == null) {
// Not initialized yet: assume no active threads.
return 0;
}
return this.threadPoolExecutor.getActiveCount();
} }
......
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -62,14 +62,18 @@ public class ThreadPoolTaskScheduler extends ExecutorConfigurationSupport ...@@ -62,14 +62,18 @@ public class ThreadPoolTaskScheduler extends ExecutorConfigurationSupport
/** /**
* Set the ScheduledExecutorService's pool size. * Set the ScheduledExecutorService's pool size.
* Default is 1. * Default is 1.
* <p><b>This setting can be modified at runtime, for example through JMX.</b>
*/ */
public void setPoolSize(int poolSize) { public void setPoolSize(int poolSize) {
Assert.isTrue(poolSize > 0, "'poolSize' must be 1 or higher"); Assert.isTrue(poolSize > 0, "'poolSize' must be 1 or higher");
this.poolSize = poolSize; this.poolSize = poolSize;
if (this.scheduledExecutor instanceof ScheduledThreadPoolExecutor) {
((ScheduledThreadPoolExecutor) this.scheduledExecutor).setCorePoolSize(poolSize);
}
} }
/** /**
* Provide an {@link ErrorHandler} strategy. * Set a custom {@link ErrorHandler} strategy.
*/ */
public void setErrorHandler(ErrorHandler errorHandler) { public void setErrorHandler(ErrorHandler errorHandler) {
Assert.notNull(errorHandler, "'errorHandler' must not be null"); Assert.notNull(errorHandler, "'errorHandler' must not be null");
...@@ -111,6 +115,47 @@ public class ThreadPoolTaskScheduler extends ExecutorConfigurationSupport ...@@ -111,6 +115,47 @@ public class ThreadPoolTaskScheduler extends ExecutorConfigurationSupport
return this.scheduledExecutor; return this.scheduledExecutor;
} }
/**
* Return the underlying ScheduledThreadPoolExecutor, if available.
* @return the underlying ScheduledExecutorService (never {@code null})
* @throws IllegalStateException if the ThreadPoolTaskScheduler hasn't been initialized yet
* or if the underlying ScheduledExecutorService isn't a ScheduledThreadPoolExecutor
* @see #getScheduledExecutor()
*/
public ScheduledThreadPoolExecutor getScheduledThreadPoolExecutor() throws IllegalStateException {
Assert.state(this.scheduledExecutor instanceof ScheduledThreadPoolExecutor,
"No ScheduledThreadPoolExecutor available");
return (ScheduledThreadPoolExecutor) this.scheduledExecutor;
}
/**
* Return the current pool size.
* <p>Requires an underlying {@link ScheduledThreadPoolExecutor}.
* @see #getScheduledThreadPoolExecutor()
* @see java.util.concurrent.ScheduledThreadPoolExecutor#getPoolSize()
*/
public int getPoolSize() {
if (this.scheduledExecutor == null) {
// Not initialized yet: assume initial pool size.
return this.poolSize;
}
return getScheduledThreadPoolExecutor().getPoolSize();
}
/**
* Return the number of currently active threads.
* <p>Requires an underlying {@link ScheduledThreadPoolExecutor}.
* @see #getScheduledThreadPoolExecutor()
* @see java.util.concurrent.ScheduledThreadPoolExecutor#getActiveCount()
*/
public int getActiveCount() {
if (this.scheduledExecutor == null) {
// Not initialized yet: assume no active threads.
return 0;
}
return getScheduledThreadPoolExecutor().getActiveCount();
}
// SchedulingTaskExecutor implementation // SchedulingTaskExecutor implementation
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册