手把手教你写线程池工具类
首先创建一个线程池配置类如下:
package com.alibaba.health.common.util;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 通用线程池
*/
@Configuration
public class ThreadPoolExecutorUtil {
/**
* 线程池维护核心线程数量
*/
@Value("${thread.pool.corePoolSize}")
public int corePoolSize;
/**
* 线程池维护的最大数量
*/
@Value("${thread.pool.maxPoolSize}")
public int maxPoolSize;
/**
* 线程池维护队列数
*/
@Value("${thread.pool.queueCapacity}")
public int queueCapacity;
/**
* 线程池允许的空闲时间
*/
@Value("${thread.pool.keepAlive}")
public int keepAlive;
/**
* 加入bean容器
* @return
*/
@Bean(name = "commonThreadPool")
public ThreadPoolTaskExecutor getThreadPoolExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setThreadNamePrefix("threadPoolExecutor");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
executor.setKeepAliveSeconds(keepAlive);
executor.initialize();
return executor;
}
}
然后在需要的业务类中依赖注入线程池对象:
@Resource(name="commonThreadPool")
private ThreadPoolTaskExecutor threadPool;
@Autowired
这里说明一下,为什么没有用autowired,是为了更清晰的给大家展示,因为在配置类中添加到bean容器时,已经是使用名称的方式,所以这边使用
Resource,当然,根据自己的习惯,两者都可以很好的用起来
在需要的业务方法中调用示例:
public List<Dictionary> findByGroupId(String groupid) {
threadPool.execute(() ->{
commonMapper.addDistrict(object);
});
return commonMapper.findByGroupId(groupid);
}
在实际开发过程中,此工具类是可以拿来直接使用的,更多使用技巧,同学们多多试验吧,我在这里就不一一举例展示了