vlambda博客
学习文章列表

手把手教你写线程池工具类

首先创建一个线程池配置类如下:

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);

}


在实际开发过程中,此工具类是可以拿来直接使用的,更多使用技巧,同学们多多试验吧,我在这里就不一一举例展示了