1.线程池的七大参数及执行流程
七大参数
(1)corePoolSize:核心线程数,指的是核心线程大小,线程池中维护一个最小的线程数量,即使这些线程处于空闲状态,也一直存在池中,除非设置了核心线程超时时间。
(2)maximunPoolSize:最大线程数,指的是线程池中允许的最大线程数量。
(3)keepAliveTime:空闲线程存活时间,具体说,当线程数大于核心线程数时,空闲线程在等待新任务到达的最大时间,如果超过这个时间还没有任务请求,该空闲线程就会被销毁。
(4)unit:空闲线程存活时间的单位,keepAliveTime的计量单位。枚举类型TimeUnit类。
(5)workQueue:线程工作队列,当线程池中已经存在核心数量的线程时候,再请求新的任务,这时就会将任务加入工作队列的队尾,一旦有空闲线程,就会取出队头执行任务,阻塞队列一般有下列五种。
ArrayBlockingQueue: FIFO有界阻塞队列。
LinkedBlockingQueue: FIFO无限队列,基于链表的无界阻塞队列,默认最大容量Integer.MAX_VALUE( )。
PriorityBlockingQueue:优先级无界阻塞队列,前面两种工作队列特点都是FIFO,而优先级阻塞队列可以通过参数Comparator实现对任务进行排序,不按照FIFO执行。
SynchronousQueue:不缓存任务的阻塞队列,它实际上不是真正的队列,因为它没有提供存储任务的空间。生产者一个任务请求到来,会直接执行,也就是说这种队列在消费者充足的情况下更加适合。因为这种队列没有存储能力,所以只有当另一个线程(消费者)准备好工作,put(入队)和take(出队)方法才不会是阻塞状态。
(6)threadFactory:线程工厂,用于创建一个新线程时使用的工厂,可以用来设定线程名、是否为daemon线程等。
(7)handler:超出线程数和工作队列时候的任务请求处理策略,拒绝策略一般有下列四种。
AbortPolicy: 直接抛出RejectedExecutionException异常
CallerRunsPolicy: 交由主线程执行
DiscardOldestPolicy: 抛弃工作队列中旧的任务,将新任务添加进队列;会导致被丢弃的任务无法再次被执行
DiscardPolicy: 抛弃当前任务;会导致被抛弃的任务无法再次被执行
执行流程
具体流程如下图所示
2.Springboot中配置线程池
(1)配置线程池
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@Configuration
@EnableAsync // 允许使用异步方法
public class ThreadPoolConfig {
@Bean("taskExecutor")
public Executor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
// 设置核心线程数
threadPoolTaskExecutor.setCorePoolSize(10);
// 设置最大线程数
threadPoolTaskExecutor.setMaxPoolSize(30);
// 设置工作队列大小
threadPoolTaskExecutor.setQueueCapacity(100);
//设置空闲线程死亡时间
threadPoolTaskExecutor.setKeepAliveSeconds(300);
// 设置拒绝策略.当工作队列已满,线程数为最大线程数的时候,接收新任务抛出RejectedExecutionException异常
threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
// 初始化线程池
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
}
(2)配置测试接口及其实现类
接口
package com.walker.async.service.async;
public interface TestAsync {
void doAsync();
}
实现类
package com.walker.async.service.async.impl;
import com.walker.async.service.async.TestAsync;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class TestAsyncImpl implements TestAsync {
@Override
//使用@Async,并将前面的注册的bean,填写到Async的value中
@Async("taskExecutor")
public void doAsync() {
log.info("== async start==");
log.info("线程{}执行代码逻辑",Thread.currentThread().getName());
log.info("== async end==");
}
}
(3)测试
package com.walker.async;
import com.walker.async.service.async.TestAsync;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class AsyncTest {
//引用类
@Autowired
private TestAsync testAsync;
@Test
void test(){
for (int i = 0; i < 10; i++) {
testAsync.doAsync();
}
}
}
(4)返回结果
2023-01-29 16:47:12.491 INFO 13332 --- [ taskExecutor-1] c.w.a.service.async.impl.TestAsyncImpl : == async start==
2023-01-29 16:47:12.491 INFO 13332 --- [ taskExecutor-3] c.w.a.service.async.impl.TestAsyncImpl : == async start==
2023-01-29 16:47:12.493 INFO 13332 --- [ taskExecutor-5] c.w.a.service.async.impl.TestAsyncImpl : == async start==
2023-01-29 16:47:12.493 INFO 13332 --- [ taskExecutor-6] c.w.a.service.async.impl.TestAsyncImpl : == async start==
2023-01-29 16:47:12.493 INFO 13332 --- [ taskExecutor-1] c.w.a.service.async.impl.TestAsyncImpl : == async start==
2023-01-29 16:47:12.501 INFO 13332 --- [ taskExecutor-9] c.w.a.service.async.impl.TestAsyncImpl : == async start==
2023-01-29 16:47:12.501 INFO 13332 --- [taskExecutor-10] c.w.a.service.async.impl.TestAsyncImpl : == async start==
2023-01-29 16:47:12.500 INFO 13332 --- [ taskExecutor-7] c.w.a.service.async.impl.TestAsyncImpl : == async start==
2023-01-29 16:47:12.502 INFO 13332 --- [ taskExecutor-8] c.w.a.service.async.impl.TestAsyncImpl : == async start==
2023-01-29 16:47:12.500 INFO 13332 --- [ taskExecutor-7] c.w.a.service.async.impl.TestAsyncImpl : == async start==
2023-01-29 16:47:12.502 INFO 13332 --- [ taskExecutor-6] c.w.a.service.async.impl.TestAsyncImpl : 线程taskExecutor-6执行代码逻辑
2023-01-29 16:47:12.501 INFO 13332 --- [ taskExecutor-8] c.w.a.service.async.impl.TestAsyncImpl : 线程taskExecutor-8执行代码逻辑
2023-01-29 16:47:12.503 INFO 13332 --- [ taskExecutor-5] c.w.a.service.async.impl.TestAsyncImpl : == async end==
2023-01-29 16:47:12.492 INFO 13332 --- [ taskExecutor-9] c.w.a.service.async.impl.TestAsyncImpl : 线程taskExecutor-9执行代码逻辑
2023-01-29 16:47:12.503 INFO 13332 --- [ taskExecutor-2] c.w.a.service.async.impl.TestAsyncImpl : == async end==
2023-01-29 16:47:12.503 INFO 13332 --- [ taskExecutor-7] c.w.a.service.async.impl.TestAsyncImpl : == async end==
2023-01-29 16:47:12.501 INFO 13332 --- [ taskExecutor-9] c.w.a.service.async.impl.TestAsyncImpl : 线程taskExecutor-9执行代码逻辑
2023-01-29 16:47:12.492 INFO 13332 --- [ taskExecutor-1] c.w.a.service.async.impl.TestAsyncImpl : 线程taskExecutor-1执行代码逻辑
2023-01-29 16:47:12.506 INFO 13332 --- [ taskExecutor-1] c.w.a.service.async.impl.TestAsyncImpl : == async end==
2023-01-29 16:47:12.506 INFO 13332 --- [ taskExecutor-9] c.w.a.service.async.impl.TestAsyncImpl : == async end==
2023-01-29 16:47:12.493 INFO 13332 --- [ taskExecutor-3] c.w.a.service.async.impl.TestAsyncImpl : 线程taskExecutor-3执行代码逻辑
2023-01-29 16:47:12.501 INFO 13332 --- [taskExecutor-10] c.w.a.service.async.impl.TestAsyncImpl : 线程taskExecutor-10执行代码逻辑
2023-01-29 16:47:12.506 INFO 13332 --- [ taskExecutor-3] c.w.a.service.async.impl.TestAsyncImpl : == async end==
2023-01-29 16:47:12.506 INFO 13332 --- [taskExecutor-10] c.w.a.service.async.impl.TestAsyncImpl : == async end==
2023-01-29 16:47:12.502 INFO 13332 --- [ taskExecutor-8] c.w.a.service.async.impl.TestAsyncImpl : 线程taskExecutor-8执行代码逻辑
2023-01-29 16:47:12.506 INFO 13332 --- [ taskExecutor-8] c.w.a.service.async.impl.TestAsyncImpl : == async end==
2023-01-29 16:47:12.502 INFO 13332 --- [ taskExecutor-7] c.w.a.service.async.impl.TestAsyncImpl : 线程taskExecutor-7执行代码逻辑
2023-01-29 16:47:12.508 INFO 13332 --- [ taskExecutor-7] c.w.a.service.async.impl.TestAsyncImpl : == async end==
2023-01-29 16:47:12.493 INFO 13332 --- [ taskExecutor-4] c.w.a.service.async.impl.TestAsyncImpl : 线程taskExecutor-4执行代码逻辑
2023-01-29 16:47:12.508 INFO 13332 --- [ taskExecutor-4] c.w.a.service.async.impl.TestAsyncImpl : == async end==