我们过去实现多线程的方式通常是继承 Thread类或者实现Runnable 接口,这种方式实现起来比较麻烦。spring封装了Java的多线程的实现,你只需要关注于并发事物的流程以及一些并发负载量等特性。spring通过任务执行器TaskExecutor
来实现多线程与并发编程。通常使用ThreadPoolTaskExecutor
来实现一个基于线程池的TaskExecutor
.
开启线程池
首先你要实现 AsyncConfigurer
这个接口,目的是开启一个线程池 ,这个步骤我们可以基于spring的配置文件实现,修改applicationContext-timer.xml
文件,代码如下
<?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">
<!--开启注解驱动-->
<task:annotation-driven executor="taskExecutor" scheduler="seckillScheduler"/>
<task:scheduler id="seckillScheduler" pool-size="10"/>
<!--
线程池
-->
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<!--初始线程数量-->
<property name="corePoolSize" value="10" />
<!--最大线程数量-->
<property name="maxPoolSize" value="100" />
<!--最大队列数量-->
<property name="queueCapacity" value="200" />
<!--线程最大空闲时间-->
<property name="keepAliveSeconds" value="3000" />
<!--
拒绝策略,当线程池中的线程被占用完了,没有剩余线程了,如果此时有新的任务要执行,该采取的策略
-->
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy" />
</property>
</bean>
</beans>
异步执行声明
然后注入一个类,实现你的业务,并在你的Bean的方法中使用@Async注解来声明其是一个异步任务,如:
/***
* 多线程下单操作
*/
@Async
public void createOrder(){
try {
System.out.println("准备执行....");
Thread.sleep(20000);
System.out.println("开始执行....");
} catch (InterruptedException e) {
e.printStackTrace();
}
}