SpringBoot配置异步任务(@Async)线程池

1. 使用ThreadFactoryBuilder设置线程名需要引入依赖

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

 2. 编写配置类

@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {

    /**
     * 自定义线程池
     * corePoolSize: 核心线程 32 个
     * maximumPoolSize: 最大线程数 64 个
     * keepAliveTime: 保持活性时间 30
     * unit: 时间单位
     * workQueue: 队列
     * nameThreadFactory: 设置线程名
     * handler: 拒绝策略
     *
     * 执行流程:
     *     1.当提交了一个任务,查看当前是否达到核心线程数,没有达到,创建线程执行
     *     2.达到了核心线程数,查看队列是否已满,未满,放入队列
     *     3.满了,查看是否达到最大线程数,未达到,创建线程执行任务
     *     4.已达到最大线程数,执行拒绝
     *
     * 拒绝策略:
     *     1.AbortPolicy: 默认策略,直接抛出异常
     *     2.CallRunsPolicy: 用调用者所在线程执行任务
     *     3.DisCardOldestPolicy: 丢弃阻塞队列的头部任务,执行当前任务
     *     4.DsicardPolicy: 直接丢弃任务
     */
    @Override
    public Executor getAsyncExecutor() {
        // 设置线程名
        ThreadFactory nameThreadFactory = new ThreadFactoryBuilder().setNameFormat("async-pool-%d").build();
        return new ThreadPoolExecutor(32,
                64,
                30,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(128),
                nameThreadFactory,
                new ThreadPoolExecutor.CallerRunsPolicy());
    }
}

3. 测试

@Service
public class AsyncService {

    @Async
    public void testAsync() {
        System.out.println(Thread.currentThread().getName() + " 正在执行任务...");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


@RestController
public class AsyncController {
    @Autowired
    private AsyncService asyncService;

    @GetMapping("/async/test")
    public void asyncTest() {
        asyncService.testAsync();
    }
}

4. 打印结果如下

SpringBoot配置异步任务(@Async)线程池

 

上一篇:异步任务处理注解方法@Async实现异步多线程


下一篇:ECMAScript6学习简易笔记(下)