线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。
在开发中,有的接口
1、首先在配置文件初始化线程池
@Configuration
@EnableAsync
public class Config {
private static final int MAX_POOL_SIZE = 50;
private static final int CORE_POOL_SIZE = 20;
@Bean("customer-system-thread")
public Executor carSocketExecutor() {
//获取当前机器的核数
int cpuNum = Runtime.getRuntime().availableProcessors();
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(cpuNum);
//配置最大线程数
executor.setMaxPoolSize(cpuNum * 2);
//配置队列大小
executor.setQueueCapacity(100);
//线程存活时间
executor.setKeepAliveSeconds(60);
//配置线程池中的线程的名称前缀
executor.setThreadNamePrefix("customer-system-");
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//执行初始化
executor.initialize();
return executor;
}
}
2、编写具体需要异步做的事情,在方法上增加注解@Async,表示该方法从线程池中获取线程来执行,其中线程池名称为非必填。
/**
* 异步做的具体的业务事情
* @author lsh
* @date 2022/4/15
*/
@Component
@Slf4j
public class CollectQualificationFeeAsyncService {
@Async("customer-system-thread")
public void collectQualificationFee(String id){
System.out.println(Thread.currentThread().getName());
}
}
3、写一个service测试一下
@Service("qualificationManagement.test.1")
@ApiRequestObject(value = "测试", name = "testParameters", groups = "测试异步")
@Slf4j
public class TestService implements IBusinessService {
@Resource
private CollectQualificationFeeAsyncService collectQualificationFeeAsyncService;
@Override
public void doVerify(ServiceHandlerContext context) {
}
@Override
public void doWork(ServiceHandlerContext context) {
List<String> ids = new ArrayList<>();
ids.add("1");
ids.add("2");
ids.add("3");
ids.add("4");
ids.add("5");
for (String id:ids) {
collectQualificationFeeAsyncService.collectQualificationFee(id);
}
}
}
4、在异步具体做的事情中我们打印了每次请求的线程名称,下图是结果,可以清楚的看到每次请求是不同的线程做的。