- 了解TaskExecutor接口
当创建了一个新的 Configuration 对象时,它使用一个 maxStrongSize 值为 0 的 MruCacheStorage 缓存来 初 始 化 , maxSoftSize 的值是 Integer.MAX_VALUE(也就是说在实际中, 是无限大 的)。但是使用 非 0 的 maxStrongSize 对于高负载的服务器来说也许是一个更好的策略,对于少量引用的组 件来说,如果资源消耗已经很高的话,Java 虚拟机往往会引发更高的资源消耗,因为它不断 从缓存中抛出经常使用的模板,这些模板还不得不再次加载和解析。
- TaskExecutor接口的实现类
- SimpleAsyncTaskExecutor类:这个实现不重用任何线程,或者说它每次调用都启动一个新线程。但是,它还是支持对并发总数设限,当超过线程并发总数限制时,阻塞新的调用,直到有位置被释放。
- SyncTaskExecutor类:这个实现不会异步执行。相反,每次调用都在发起调用的线程中执行。它的主要用处是在不需要多线程的时候,比如简单的test case。
- ConcurrentTaskExecutor类:这个实现是对java.util.concurrent.Executor类的包装。
- SimpleThreadPoolTaskExecutor类:这个实现实际上是Quartz的SimpleThreadPool类的子类,它会监听Spring的生命周期回调。当你有线程池,需要在Quartz和非Quartz组件中共用时,这是它的典型用处。
- ThreadPoolTaskExecutor类:它不支持任何对java.util.concurrent包的替换或者下行移植。
- TimerTaskExecutor类:这个实现使用一个TimerTask作为其背后的实现。它和SyncTaskExecutor的不同在于,方法调用是在一个独立的线程中进行的,虽然在那个线程中是同步的。
- WorkManagerTaskExecutor类:这个类实现了WorkManager接口,因此可以直接作为WorkManager使用。
- 线程池Demo之ThreadPoolTaskExecutor
import org.springframework.core.task.TaskExecutor;
public class TaskExecutorExample {
private TaskExecutor taskExecutor;
public TaskExecutorExample(TaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
}
public void printMessages() {
for(int i = 0; i < 25; i++) {
taskExecutor.execute(new MessagePrinterTask("Message" + i));
}
}
private class MessagePrinterTask implements Runnable {
private String message;
public MessagePrinterTask(String message) {
this.message = message;
}
public void run() {
System.out.println(message);
}
}
}
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<!-- 线程池活跃的线程数 -->
<property name="corePoolSize" value="5" />
<!-- 线程池最大活跃的线程数 -->
<property name="maxPoolSize" value="10" />
<!-- 队列的最大容量 -->
<property name="queueCapacity" value="25" />
</bean>
<bean id="taskExecutorExample" class="powercn.TaskExecutorExample">
<constructor-arg ref="taskExecutor" />
</bean>