配置类
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 核心线程池数量,方法;
executor.setCorePoolSize(7);
// 最大线程数量
executor.setMaxPoolSize(42);
// 线程池的队列容量
executor.setQueueCapacity(11);
// 线程名称的前缀
executor.setThreadNamePrefix("fyk-executor-");
// 线程池对拒绝任务的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new SimpleAsyncUncaughtExceptionHandler();
}
}
@EnableAsync:表示的是开启异步任务(多线程)功能;
拒绝策略常用有有这四种:
- ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常(默认);
- ThreadPoolExecutor.DiscardPolic:丢弃任务,但是不抛出异常;
- ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务;
- ThreadPoolExecutor.CallerRunsPolic:由调用线程处理该任务;
多个线程池
在配置类中,ThreadPoolTaskExecutor类是一个线程池。我们配置了一些线程池的参数。如果在使用异步任务的时候,想使用额外的线程池,也就是说,配置多个线程池:
@Configuration
public class TaskExecutorConfig {
@Bean("taskExecutor2")
public ThreadPoolTaskExecutor taskExecutor2() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 核心线程数(默认线程数)
executor.setCorePoolSize(10);
// 最大线程数
executor.setMaxPoolSize(40);
// 缓冲队列数
executor.setQueueCapacity(10);
// 允许线程空闲时间(单位:默认为秒)
executor.setKeepAliveSeconds(10);
// 线程名称的前缀
executor.setThreadNamePrefix("fyk-executor2-");
// 线程池对拒绝任务的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 初始化
executor.initialize();
return executor;
}
}
这个时候,在使用的时候,如果@Async(“taskExecutor2”),则只用的是taskExecutor2线程池。
使用
使用方式和简单,在需要开启线程的方法或者类类上,加上注解:@Async
@Component
@Slf4j
public class Test {
@Async
@Scheduled(fixedDelay = 10000)
public void handle() {
log.info("fixedDelay-每间隔多少毫秒执行一次(这个时间间隔是:最后一次调用结束和下一次调用开始之间)!");
}
@Async("taskExecutor2")
@Scheduled(fixedRate = 10000)
public void handle2() {
log.info("fixedRate-每间隔多少毫秒执行一次!");
}
}
至此,已经算完成了。
结果
从这个线程池的名字中,可以看到,分别使用的是两个线程池。
注意事项
如下方式会使@Async失效
- 异步方法使用static修饰