-
启动类中添加异步允许@EnableAsync
-
线程池配置
@Configuration
public class TaskPoolConfig {
@Bean("taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//核心线程数10:线程池创建时候初始化的线程数
executor.setCorePoolSize(1000);
//最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
executor.setMaxPoolSize(8000);
//缓冲队列200:用来缓冲执行任务的队列
executor.setQueueCapacity(1000);
//允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
executor.setKeepAliveSeconds(60);
//线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池
executor.setThreadNamePrefix("1taskExecutor-");
//线程池对拒绝任务的处理策略:这里采用了CallerRunsPolicy策略,当线程池没有处理能力的时候,
//该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean,
executor.setWaitForTasksToCompleteOnShutdown(true);
//该方法用来设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,
executor.setAwaitTerminationSeconds(3000);
return executor;
}
}
- Service中配置使用线程池,启动异步调用
@Async("taskExecutor")
public void execute(DeferredResult<Boolean> deferred){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
deferred.setResult(true);
}
- Controller中使用异步接受,因为默认单例模式,防止阻碍线程)
@RequestMapping("/")
public DeferredResult<Boolean> get() {
DeferredResult<Boolean> deferred = new DeferredResult<>();
asyncTask.execute(deferred);
return deferred;
}