org.springframework.scheduling.concurrent
Class ThreadPoolTaskExecutor

java.lang.Object
  extended by org.springframework.util.CustomizableThreadCreator
      extended by org.springframework.scheduling.concurrent.CustomizableThreadFactory
          extended by org.springframework.scheduling.concurrent.ExecutorConfigurationSupport
              extended by org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
All Implemented Interfaces:
Serializable, Executor, ThreadFactory, Aware, BeanNameAware, DisposableBean, InitializingBean, AsyncTaskExecutor, TaskExecutor, SchedulingTaskExecutor

public class ThreadPoolTaskExecutor
extends ExecutorConfigurationSupport
implements SchedulingTaskExecutor

JavaBean that allows for configuring a JDK 1.5 ThreadPoolExecutor in bean style (through its "corePoolSize", "maxPoolSize", "keepAliveSeconds", "queueCapacity" properties) and exposing it as a Spring TaskExecutor. This class is also well suited for management and monitoring (e.g. through JMX), providing several useful attributes: "corePoolSize", "maxPoolSize", "keepAliveSeconds" (all supporting updates at runtime); "poolSize", "activeCount" (for introspection only).

For an alternative, you may set up a ThreadPoolExecutor instance directly using constructor injection, or use a factory method definition that points to the JDK 1.5 Executors class. To expose such a raw Executor as a Spring TaskExecutor, simply wrap it with a ConcurrentTaskExecutor adapter.

NOTE: This class implements Spring's TaskExecutor interface as well as the JDK 1.5 Executor interface, with the former being the primary interface, the other just serving as secondary convenience. For this reason, the exception handling follows the TaskExecutor contract rather than the Executor contract, in particular regarding the TaskRejectedException.

If you prefer native ExecutorService exposure instead, consider ThreadPoolExecutorFactoryBean as an alternative to this class.

Since:
2.0
Author:
Juergen Hoeller
See Also:
TaskExecutor, ThreadPoolExecutor, ConcurrentTaskExecutor, Serialized Form

Field Summary
 
Fields inherited from class org.springframework.scheduling.concurrent.ExecutorConfigurationSupport
logger
 
Fields inherited from interface org.springframework.core.task.AsyncTaskExecutor
TIMEOUT_IMMEDIATE, TIMEOUT_INDEFINITE
 
Constructor Summary
ThreadPoolTaskExecutor()
           
 
Method Summary
protected  BlockingQueue<Runnable> createQueue(int queueCapacity)
          Create the BlockingQueue to use for the ThreadPoolExecutor.
 void execute(Runnable task)
          Execute the given task.
 void execute(Runnable task, long startTimeout)
          Execute the given task.
 int getActiveCount()
          Return the number of currently active threads.
 int getCorePoolSize()
          Return the ThreadPoolExecutor's core pool size.
 int getKeepAliveSeconds()
          Return the ThreadPoolExecutor's keep-alive seconds.
 int getMaxPoolSize()
          Return the ThreadPoolExecutor's maximum pool size.
 int getPoolSize()
          Return the current pool size.
 ThreadPoolExecutor getThreadPoolExecutor()
          Return the underlying ThreadPoolExecutor for native access.
protected  ExecutorService initializeExecutor(ThreadFactory threadFactory, RejectedExecutionHandler rejectedExecutionHandler)
          Create the target ExecutorService instance.
 boolean prefersShortLivedTasks()
          This task executor prefers short-lived work units.
 void setAllowCoreThreadTimeOut(boolean allowCoreThreadTimeOut)
          Specify whether to allow core threads to time out.
 void setCorePoolSize(int corePoolSize)
          Set the ThreadPoolExecutor's core pool size.
 void setKeepAliveSeconds(int keepAliveSeconds)
          Set the ThreadPoolExecutor's keep-alive seconds.
 void setMaxPoolSize(int maxPoolSize)
          Set the ThreadPoolExecutor's maximum pool size.
 void setQueueCapacity(int queueCapacity)
          Set the capacity for the ThreadPoolExecutor's BlockingQueue.
<T> Future<T>
submit(Callable<T> task)
          Submit a Callable task for execution, receiving a Future representing that task.
 Future<?> submit(Runnable task)
          Submit a Runnable task for execution, receiving a Future representing that task.
 
Methods inherited from class org.springframework.scheduling.concurrent.ExecutorConfigurationSupport
afterPropertiesSet, destroy, initialize, setBeanName, setRejectedExecutionHandler, setThreadFactory, setThreadNamePrefix, setWaitForTasksToCompleteOnShutdown, shutdown
 
Methods inherited from class org.springframework.scheduling.concurrent.CustomizableThreadFactory
newThread
 
Methods inherited from class org.springframework.util.CustomizableThreadCreator
createThread, getDefaultThreadNamePrefix, getThreadGroup, getThreadNamePrefix, getThreadPriority, isDaemon, nextThreadName, setDaemon, setThreadGroup, setThreadGroupName, setThreadPriority
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ThreadPoolTaskExecutor

public ThreadPoolTaskExecutor()
Method Detail

setCorePoolSize

public void setCorePoolSize(int corePoolSize)
Set the ThreadPoolExecutor's core pool size. Default is 1.

This setting can be modified at runtime, for example through JMX.


getCorePoolSize

public int getCorePoolSize()
Return the ThreadPoolExecutor's core pool size.


setMaxPoolSize

public void setMaxPoolSize(int maxPoolSize)
Set the ThreadPoolExecutor's maximum pool size. Default is Integer.MAX_VALUE.

This setting can be modified at runtime, for example through JMX.


getMaxPoolSize

public int getMaxPoolSize()
Return the ThreadPoolExecutor's maximum pool size.


setKeepAliveSeconds

public void setKeepAliveSeconds(int keepAliveSeconds)
Set the ThreadPoolExecutor's keep-alive seconds. Default is 60.

This setting can be modified at runtime, for example through JMX.


getKeepAliveSeconds

public int getKeepAliveSeconds()
Return the ThreadPoolExecutor's keep-alive seconds.


setAllowCoreThreadTimeOut

public void setAllowCoreThreadTimeOut(boolean allowCoreThreadTimeOut)
Specify whether to allow core threads to time out. This enables dynamic growing and shrinking even in combination with a non-zero queue (since the max pool size will only grow once the queue is full).

Default is "false". Note that this feature is only available on Java 6 or above. On Java 5, consider switching to the backport-concurrent version of ThreadPoolTaskExecutor which also supports this feature.

See Also:
ThreadPoolExecutor.allowCoreThreadTimeOut(boolean)

setQueueCapacity

public void setQueueCapacity(int queueCapacity)
Set the capacity for the ThreadPoolExecutor's BlockingQueue. Default is Integer.MAX_VALUE.

Any positive value will lead to a LinkedBlockingQueue instance; any other value will lead to a SynchronousQueue instance.

See Also:
LinkedBlockingQueue, SynchronousQueue

initializeExecutor

protected ExecutorService initializeExecutor(ThreadFactory threadFactory,
                                             RejectedExecutionHandler rejectedExecutionHandler)
Description copied from class: ExecutorConfigurationSupport
Create the target ExecutorService instance. Called by afterPropertiesSet.

Specified by:
initializeExecutor in class ExecutorConfigurationSupport
Parameters:
threadFactory - the ThreadFactory to use
rejectedExecutionHandler - the RejectedExecutionHandler to use
Returns:
a new ExecutorService instance
See Also:
ExecutorConfigurationSupport.afterPropertiesSet()

createQueue

protected BlockingQueue<Runnable> createQueue(int queueCapacity)
Create the BlockingQueue to use for the ThreadPoolExecutor.

A LinkedBlockingQueue instance will be created for a positive capacity value; a SynchronousQueue else.

Parameters:
queueCapacity - the specified queue capacity
Returns:
the BlockingQueue instance
See Also:
LinkedBlockingQueue, SynchronousQueue

getThreadPoolExecutor

public ThreadPoolExecutor getThreadPoolExecutor()
                                         throws IllegalStateException
Return the underlying ThreadPoolExecutor for native access.

Returns:
the underlying ThreadPoolExecutor (never null)
Throws:
IllegalStateException - if the ThreadPoolTaskExecutor hasn't been initialized yet

getPoolSize

public int getPoolSize()
Return the current pool size.

See Also:
ThreadPoolExecutor.getPoolSize()

getActiveCount

public int getActiveCount()
Return the number of currently active threads.

See Also:
ThreadPoolExecutor.getActiveCount()

execute

public void execute(Runnable task)
Description copied from interface: TaskExecutor
Execute the given task.

The call might return immediately if the implementation uses an asynchronous execution strategy, or might block in the case of synchronous execution.

Specified by:
execute in interface Executor
Specified by:
execute in interface TaskExecutor
Parameters:
task - the Runnable to execute (never null)

execute

public void execute(Runnable task,
                    long startTimeout)
Description copied from interface: AsyncTaskExecutor
Execute the given task.

Specified by:
execute in interface AsyncTaskExecutor
Parameters:
task - the Runnable to execute (never null)
startTimeout - the time duration (milliseconds) within which the task is supposed to start. This is intended as a hint to the executor, allowing for preferred handling of immediate tasks. Typical values are AsyncTaskExecutor.TIMEOUT_IMMEDIATE or AsyncTaskExecutor.TIMEOUT_INDEFINITE (the default as used by TaskExecutor.execute(Runnable)).

submit

public Future<?> submit(Runnable task)
Description copied from interface: AsyncTaskExecutor
Submit a Runnable task for execution, receiving a Future representing that task. The Future will return a null result upon completion.

Specified by:
submit in interface AsyncTaskExecutor
Parameters:
task - the Runnable to execute (never null)
Returns:
a Future representing pending completion of the task

submit

public <T> Future<T> submit(Callable<T> task)
Description copied from interface: AsyncTaskExecutor
Submit a Callable task for execution, receiving a Future representing that task. The Future will return the Callable's result upon completion.

Specified by:
submit in interface AsyncTaskExecutor
Parameters:
task - the Callable to execute (never null)
Returns:
a Future representing pending completion of the task

prefersShortLivedTasks

public boolean prefersShortLivedTasks()
This task executor prefers short-lived work units.

Specified by:
prefersShortLivedTasks in interface SchedulingTaskExecutor
Returns:
true if this TaskExecutor prefers short-lived tasks