虎丘苏州网站建设,做网站的软件项目进度计划,苏州网站开发培训班,成都营销策划公司开发中会碰到一些耗时较长或者不需要立即得到执行结果的逻辑#xff0c;比如消息推送、商品同步等都可以使用异步方法#xff0c;这时我们可以用到Async。但是直接使用 Async 会有风险#xff0c;当我们没有指定线程池时#xff0c;他会默认使用其Spring自带的 SimpleAsync… 开发中会碰到一些耗时较长或者不需要立即得到执行结果的逻辑比如消息推送、商品同步等都可以使用异步方法这时我们可以用到Async。但是直接使用 Async 会有风险当我们没有指定线程池时他会默认使用其Spring自带的 SimpleAsyncTaskExecutor 线程池会不断的创建线程当并发大的时候会严重影响性能。所以可以将异步指定线程池使用。 Async用法可以标注在类或方法上用于实现方法的异步执行。当被标注在类上时表明类中的所有方法都被指定的异步执行器执行。
一、开启异步
启动类添加EnableAsync开启异步
EnableAsync
SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}二、配置线程池
可以在yml里配置我这里写的配置类
EnableAsync
Configuration
public class ThreadPoolConfig {/*** 线程池任务执行器* return*/Beanpublic Executor taskExecutor() {// 创建线程池ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();executor.setCorePoolSize(5); // 设置核心池大小executor.setMaxPoolSize(10); // 设置最大池大小只有在缓冲队列满了之后才会申请超过核心线程数的线程executor.setQueueCapacity(100); // 设置队列容量executor.setKeepAliveSeconds(60); // 设置保持活动秒数当超过了核心线程数之外的线程在空闲时间到达之后会被销毁executor.setThreadNamePrefix(开始啦Thread-); // 设置线程名称前缀// 设置拒绝的执行处理策略executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());return executor;}
}拒绝策略通常有四种
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。ThreadPoolExecutor.DiscardPolicy也是丢弃任务但是不抛出异常。ThreadPoolExecutor.DiscardOldestPolicy丢弃队列最前面的任务然后重新尝试执行任务重复此过程ThreadPoolExecutor.CallerRunsPolicy重试添加当前的任务自动重复调用 execute() 方法直到成功
注配置类需要加上EnableAsync开启异步可用
三、Async指定线程池
在Async注解中直接指定线程池名称即可 Async(taskExecutor)public void asyncDemo() {// 逻辑代码...}四、Async失效可能原因
启动类或线程池配置类没加EnableAsync注解调用方法和Async方法不要在一个类中Async方法的返回值只能是void和FutureAsync修饰的方法不能被static修饰Async修饰的的方法必须是public 题外话之前面试有问到过异步线程池的大小怎么合理来设置感兴趣的小伙伴们可以去研究一下哈