Spring 通过 ThreadPoolTaskExecutor 实现线程池技术,它是使用 JDK 中的 java.util.concurrent.ThreadPoolExecutor 进行实现;
Spring 配置线程池,两种方式:
方式1:XML 中配置 bean
<!-- 包路径扫描 -->
<context:component-scan base-package="spring.task"/>
<!-- Spring线程池 -->
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<!-- 核心线程数 -->
<property name="corePoolSize" value="5" />
<!-- 线程池维护线程的最大数量 -->
<property name="maxPoolSize" value="10" />
<!-- 允许的空闲时间, 默认60秒 -->
<property name="keepAliveSeconds" value="60" />
<!-- 任务队列 -->
<property name="queueCapacity" value="50" />
<!-- 线程超过空闲时间限制,均会退出直到线程数量为0 -->
<property name="allowCoreThreadTimeOut" value="true"/>
<!-- 对拒绝task的处理策略 -->
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor.DiscardOldestPolicy" />
</property>
</bean>
配置解析:
新任务启动时:
方式2:XML中 使用 task:executor 标签
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation=
"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
<!-- 包路径扫描 -->
<context:component-scan base-package="spring.task"/>
<!-- 定义线程池 -->
<task:executor id="executor" pool-size="5" queue-capacity="10" rejection-policy="DISCARD_OLDEST"/>
</beans>
测试:定义一个组件类,在应用启动时,同时启动 10 个线程;
@Component
public class AsyncTask {
@Autowired
private ThreadPoolTaskExecutor executor;
@PostConstruct
public void testAsycTask() {
for (int i = 0; i < 10; i++) {
executor.execute(new Runnable() {
public void run() {
asyncTask();
}
});
}
}
private void asyncTask(){
System.out.println( "---" + Thread.currentThread().getName());
}
}
注意:
@PostConstruct 用来修饰一个非静态的void() 方法;被 @PostConstruct 修饰的方法会在服务器加载 Servlet 的时候运行,并且只会被服务器执行一次;@PostConstruct 在构造函数之后执行,init() 方法之前执行;
结果:
---executor-1
---executor-2
---executor-3
---executor-4
---executor-5
---executor-6
---executor-7
---executor-8
---executor-9
---executor-10