@Async 放在方法前,方法可以异步执行
@EnableAsync可以开启异步执行
配置类中,配置@Bean 返回Executor或ThreadPoolTaskScheduler,可以实现自定义的线程池,并实现对线程池的配置
@Configuration
@EnableAsync
public class config
{
@Bean
public Executor getExecutor()
{
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(25);
executor.initialize();
return executor;
}
@Bean
public ThreadPoolTaskScheduler taskScheduler()
{
log.info("Setting up thread pool task scheduler with 20 threads.");
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(20);
scheduler.setThreadNamePrefix("task-");
scheduler.setAwaitTerminationSeconds(60);
scheduler.setWaitForTasksToCompleteOnShutdown(true);
//异常处理方法
//当用@Async注解的方法抛出异常的时候,可以使用该方法去处理异常
scheduler.setErrorHandler(t -> schedulingLogger.error(
"Unknown error occurred while executing task.", t
));
//当线程池关闭的时候,如果再向线程池添加任务会抛出RejectedExecutionHandler异常
//抛出的异常将会被该异常处理器接受
scheduler.setRejectedExecutionHandler(
(r, e) -> schedulingLogger.error(
"Execution of task {} was rejected for unknown reasons.", r
)
);
return scheduler;
}
}
以上两个Bean都可以实现对线程池的自定义。
也可以实现AsyncConffigurer接口实现对线程池更精细的粒度控制
@Component
public class MyAsyncConfigurer implements AsyncConfigurer{
@Override
public Executor getAsyncExecutor() {
......
}
//实现对运行中线程抛出的异常更精细的处理
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new AsyncUncaughtExceptionHandler() {
@Override
public void handleUncaughtException(Throwable ex, Method method, Object... params) {
}
}
}
//自定义任务执行器:在定义了多个任务执行器的情况下,可以使用@Async("getMineAsync")来设定
@Bean
public Executor getMineAsync() {
}
}