【笔记】Spring框架中的线程池

前言

配置Spring框架中的线程池

配置

pool

core-size:配置线程池中核心线程数,当池中线程没有达到这个值时,每次从池中请求线程都会创建一个新的线程
max-size:配置线程池中最大线程数,当池中核心线程都在忙,任务队列也满了,此时又有新的任务要交给池中线程去执行,当池>中线程没有达到最大值时,此时创建新的线程去执行任务
queue-capacity:配置线程池中任务队列,当池中核心线程都在忙,又有新的任务要交给池中线程去执行,此时可以将任务存储到任务队列
keep-alive:配置超时,当池中线程数大于核心线程数,又没有新的任务时,此时空闲下来的线程,超过keep-alive这个参数指定的值,线程会被释放

thread-name-prefix:定义池中线程名的前缀,默认为task-

1
2
3
4
5
6
7
8
9
spring:
task:
execution:
pool:
core-size: 8
max-size: 128
queue-capacity: 256
keep-alive: 120s
thread-name-prefix: task-

创建线程池对象

创建线程工厂

1
2
3
4
5
6
7
8
9
ThreadFactory threadFactory = new ThreadFactory() {
// 创建一个线程安全的自增长整型数
private AtomicLong atomicLong = new AtomicLong(1);
@Override
public Thread newThread(Runnable r) {
// getAndIncrement()为先获取后自增
return new Thread(r, "thread-"+atomicLong.getAndIncrement());
}
};

创建线程池对象

1
2
3
4
5
6
7
8
9
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
8, // 核心线程数
128, // 最大线程数
120, // 线程空闲时间
TimeUnit.SECONDS, // 时间单位
new ArrayBlockingQueue<>(1), // 任务队列
threadFactory, // 线程工厂
new ThreadPoolExecutor.CallerRunsPolicy()
);

调用一个线程来执行任务

1
2
3
4
5
6
threadPoolExecutor.execute(new Runnable() {
@Override
public void run() {
...
}
});

完成