@Configuration
@EnableAsync
@Configuration用于定义配置类,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
@EnableAsync开始对异步任务的支持
@Async(value = "asyncOrderRespTaskExecutor")
注解来声明一个或多个异步任务,可以加在方法或者类上,加在类上表示这整个类都是使用这个自定义线程池进行操作
@Configuration
@EnableAsync
@Slf4j
public class OrderRespAsyncTaskConfig {
/**
* Set the ThreadPoolExecutor's core pool size.
*/
private int corePoolSize = 300;
/**
* Set the ThreadPoolExecutor's maximum pool size.
*/
private int maxPoolSize = 300;
private String ThreadNamePrefix = "OrderResp-Async-Executor-";
@Bean
public Executor asyncOrderRespTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setThreadNamePrefix(ThreadNamePrefix);
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
if (executor != null) {
executor.shutdown();
}
} catch (Exception ex) {
log.error("AsyncTaskConfig.executor.shutdown() error", ex);
try {
executor.shutdown();
} catch (Exception e) {
log.error("AsyncTaskConfig.executor.shutdownNow() error", e);
}
}
}));
return executor;
}
}
@Async注解来声明一个或多个异步任务,可以加在方法或者类上,加在类上表示这整个类都是使用这个自定义线程池进行操作
接着我们可以创建control类@Autowired这个service并且调用这其中两个方法,进行连续调用,会发现运行结果是
--------start-service1------------
--------start-service2------------
--------end-service2------------
--------end-service1------------
可以说明我们的异步运行成功了