背景
其实我们经常碰到这样的场景:自定义线程池,然后把业务代码丢到线程池中异步执行。代码在执行的时候,将会在独立的线程中被执行,我们无需等待它的完成,也无需关心它的调用结果。
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();
}
}
}
总结
以上就是自定义线程池的简单用法,具体参数的含义,可阅读这篇文章,博主详细的介绍了线程池各参数的含义及作用。