适用范围:不需要返回值且想要接口非常快的的需求,例如数据埋点,日记等,废话不多说直接开始搭建项目。

首先用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;
    }
}

测试快速的请求接口,即使线程阻塞也会发现请求非常的快