【Spring基础】自定义线程池及异步调用

背景

其实我们经常碰到这样的场景:自定义线程池,然后把业务代码丢到线程池中异步执行。代码在执行的时候,将会在独立的线程中被执行,我们无需等待它的完成,也无需关心它的调用结果。

ThreadPoolTaskExecutor

新建一个spring项目(点击https://start.spring.io/,根据需要命名,选择Maven或者Gradle,下载压缩包,在IDE中打开解压缩后的文件夹即可。)

新建spring项目

线程池参数配置

可具体根据业务场景需要在配置文件(resources/application.properties)中可设置线程池参数,也可以单独创建一个xxx.properties文件。

# 核心线程数
async.executor.thread.core_pool_size=5
# 最大线程数
async.executor.thread.max_pool_size=8
# 任务队列大小
async.executor.thread.queue_capacity=2
# 线程池中线程的名称前缀
async.executor.thread.name.prefix=async-service-
# 缓冲队列中线程的空闲时间
async.executor.thread.keep_alive_seconds=100

定义config类

在config中把设置的参数导入。

@Configuration
@PropertySource(value = {"classpath:application.properties"}, ignoreResourceNotFound=false, encoding="UTF-8")
public class ExecutorConfig {
    @Value("${async.executor.thread.core_pool_size}")
    private int corePoolSize;
    @Value("${async.executor.thread.max_pool_size}")
    private int maxPoolSize;
    @Value("${async.executor.thread.queue_capacity}")
    private int queueCapacity;
    @Value("${async.executor.thread.name.prefix}")
    private String namePrefix;
    @Value("${async.executor.thread.keep_alive_seconds}")
    private int keepAliveSeconds;

    @Bean(name = "asyncTaskExecutor")
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 核心线程数
        executor.setCorePoolSize(corePoolSize);
        // 最大线程数
        executor.setMaxPoolSize(maxPoolSize);
        // 任务队列大小
        executor.setQueueCapacity(queueCapacity);
        // 线程前缀名
        executor.setThreadNamePrefix(namePrefix);
        // 线程的空闲时间
        executor.setKeepAliveSeconds(keepAliveSeconds);
        // 拒绝策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 线程初始化
        executor.initialize();
        return executor;
    }
}

@Async

在需要异步执行的方法上加上@Async注释。

public class Test {
    @Async("asyncTaskExecutor")
    public void print(int threadId) {
        System.out.println("thread:" + threadId);
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

总结

以上就是自定义线程池的简单用法,具体参数的含义,可阅读这篇文章,博主详细的介绍了线程池各参数的含义及作用。

你可能感兴趣的:(【Spring基础】自定义线程池及异步调用)