1.简要说明
Spring通过任务执行器( TaskExecutor)来实现多线程和并发编程。使用
ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor. 而实际开发中任务一般是非
阻碍的,即异步的,所以我们要在配置类中通过@EnableAsyne开启对异步任务的支持,并通
过在实际执行的Bean的方法中使用@Asyne注解来声明其是- 个异步任务。
2.编写配置类
package com.lglg.config;
/**
* Date:2020/8/16
*
* @author:lg
*/
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@Configuration
@ComponentScan("com.lglg")
@EnableAsync // 注解开启多异步任务支持
public class TaskExecutorConfig implements AsyncConfigurer {
/**
* 重写该方法,并返回一个ThreadPoolTaskExecutor
* @return
*/
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(5);
taskExecutor.setMaxPoolSize(10);
taskExecutor.setQueueCapacity(25);
taskExecutor.initialize();
return taskExecutor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
}
3.编写任务执行类
package com.lglg.springdemo01;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
/**
* Date:2020/8/16
*
* @author:lg
*/
@Service
public class AsyncTaskService {
/**
* ①通过@Async注解表明该方法是个异步方法,如果注解在类级别,则表明该类所有的
方法都是异步方法,而这里的方法自动被注入使用ThreadPoolTaskExecutor作为TaskExecutor。
* @param i
*/
@Async
public void executeAsyncTask(Integer i){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
System.out.println(Thread.currentThread().getName() + "执行异步任务第一个任务====" + i);
}
public void executeAsyncTaskPlus(Integer i){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "执行异步任务第二个任务===" + (i + 1));
}
}
4.编写测试类
package com.lglg.demoTest;
import com.lglg.config.LgConfig;
import com.lglg.springdemo01.AsyncTaskService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* Date:2020/8/16
*
* @author:lg
*/
public class Demo08 {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(LgConfig.class);
AsyncTaskService bean = context.getBean(AsyncTaskService.class);
for (int i = 0; i < 10; i++) {
bean.executeAsyncTask(i);
bean.executeAsyncTaskPlus(i);
}
context.close();
}
}
5. 测试结果
main执行异步任务第二个任务=1
ThreadPoolTaskExecutor-1执行异步任务第一个任务0
main执行异步任务第二个任务=2
ThreadPoolTaskExecutor-2执行异步任务第一个任务1
main执行异步任务第二个任务=3
ThreadPoolTaskExecutor-3执行异步任务第一个任务2
main执行异步任务第二个任务=4
ThreadPoolTaskExecutor-4执行异步任务第一个任务3
ThreadPoolTaskExecutor-5执行异步任务第一个任务4
main执行异步任务第二个任务=5
main执行异步任务第二个任务=6
ThreadPoolTaskExecutor-1执行异步任务第一个任务5
main执行异步任务第二个任务=7
ThreadPoolTaskExecutor-1执行异步任务第一个任务6
main执行异步任务第二个任务=8
ThreadPoolTaskExecutor-3执行异步任务第一个任务7
ThreadPoolTaskExecutor-3执行异步任务第一个任务8
main执行异步任务第二个任务=9
ThreadPoolTaskExecutor-5执行异步任务第一个任务9
main执行异步任务第二个任务=10