适用范围:不需要返回值且想要接口非常快的的需求,例如数据埋点,日记等,废话不多说直接开始搭建项目。
首先用idea创建一个springboot工程项目
1.在启动类上加注解 @EnableAsync 开启异步任务
2.编写正常controller不依赖service的返回值
3.编写service,开启异步任务,方法没有返回值
/**
* 在什么都不配置的情况下,测试默认开启8个线程处理任务,线程名称为task-1 ~ task-8
* @throws Exception
*/
@Async
public void asyncTask() throws Exception{
long start = System.currentTimeMillis();
System.out.println("当前线程名称:" + Thread.currentThread().getName());
Thread.sleep(20000);
long end = System.currentTimeMillis();
System.out.println("service任务执行:" + (end-start));
}
4.配置线程池配置,然后什么都不用管就行了
@Configuration
public class ThreadExecutorConfig {
/**
* 配置线程池
* ThredPoolTaskExcutor的处理流程:当池子大小小于corePoolSize,就新建线程,并处理请求
* 当池子大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去workQueue中取任务并处理
* 当workQueue放不下任务时,就新建线程入池,并处理请求,如果池子大小撑到了maximumPoolSize,就用RejectedExecutionHandler来做拒绝处理
* 当池子的线程数大于corePoolSize时,多余的线程会等待keepAliveTime长时间,如果无请求可处理就自行销毁
* 其会优先创建 CorePoolSiz 线程, 当继续增加线程时,先放入Queue中,当 CorePoolSiz 和 Queue 都满的时候,就增加创建新线程,当线程达到MaxPoolSize的时候,就会抛出错
* 另外MaxPoolSize的设定如果比系统支持的线程数还要大时,会抛出java.lang.OutOfMemoryError: unable to create new native thread 异常。
* @return
*/
@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
// 线程池维护线程的最少数量
taskExecutor.setCorePoolSize(5);
// 线程池维护线程的最大数量
taskExecutor.setMaxPoolSize(10);
// 缓存队列
taskExecutor.setQueueCapacity(10);
taskExecutor.setThreadNamePrefix("MyThread");
// 设置拒绝策略
taskExecutor.setRejectedExecutionHandler(new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
// .....
System.out.println("do somethings by myself ...");
}
});
taskExecutor.initialize();
return taskExecutor;
}
}
测试快速的请求接口,即使线程阻塞也会发现请求非常的快