- 修改xml配置文件
<task:annotation-driven executor="taskExecutor" />
<!-- 线程池配置 -->
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<!-- 核心线程数 -->
<property name="corePoolSize" value="${task.pool.corePoolSize}" />
<!-- 最大线程数 -->
<property name="maxPoolSize" value="${task.pool.maxPoolSize}" />
<!-- 队列最大长度 >=mainExecutor.maxSize -->
<property name="queueCapacity" value="${task.pool.queueCapacity}" />
<!-- 线程池维护线程所允许的空闲时间 -->
<property name="keepAliveSeconds" value="${task.pool.keepAliveSeconds}" />
<!-- 线程池对拒绝任务(无线程可用)的处理策略 ThreadPoolExecutor.CallerRunsPolicy策略 ,调用者的线程会执行该任务,如果执行器已关闭,则丢弃. -->
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
</property>
</bean>
Properties 文件
#<!-- 核心线程数 -->
task.pool.corePoolSize=20
#<!-- 最大线程数 -->
task.pool.maxPoolSize=40
#<!-- 线程池维护线程所允许的空闲时间 -->
task.pool.keepAliveSeconds=300
#<!-- 队列最大长度 >=mainExecutor.maxSize -->
task.pool.queueCapacity=50
单元测试类,或者启动类上面加上@EnableAsync注解
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:/META-INF/spring/spring-provider.xml"})
@Slf4j
@EnableAsync
public class DemoServiceImplTest {
@Autowired
private DemoService demoService;
@Test
public void sayHello() throws Exception {
demoService.testAsyncA();
log.info("结束1");
//代理拿到bean
// for (int i = 0 ; i < 50 ; i++){
// demoService.testAsync(i);
// }
log.info("结束");
}
}
实现类
@Slf4j
@Service("demoService")
public class DemoServiceImpl implements DemoService {
@Override
public String testAsyncA() throws Exception {
//代理拿到bean
DemoService d = (DemoService)AopContext.currentProxy();
for (int i = 0 ; i < 50 ; i++){
d.testAsync(i);
}
log.info("结束");
return "";
}
@Override
@Async
public void testAsync(int i) throws Exception {
log.info("你猜猜我是几,其实我是{}",i);
log.info("获取主线程名称:{}" ,Thread.currentThread().getName());
Thread.sleep(500);
log.info("你猜猜我是几,其实我是{}",i);
}
}
日志打印如下
说明是异步打印的
注意:同类方法调用一定要走代理