SpringBoot使用线程池的一种方式
创建线程池
通过static代码块创建线程池:
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;
/**
* @author :kzhu
* @version :1.0
* @date :Created in 2021/3/18 10:11
* @description :自定义线程池
* @modified By:
*/
@SuppressWarnings("all")
public class HttpApiThreadPool {
/**
* 获取当前系统的CPU数目
*/
private static int cpuNums = Runtime.getRuntime().availableProcessors();
/**
* 线程池核心池的大小
*/
private static int corePoolSize = 10;
/**
* 线程池的最大线程数
*/
private static int maximumPoolSize = cpuNums * 5;
public static ExecutorService httpApiThreadPool = null;
static {
//建立10个核心线程,线程请求个数超过最大线程数时,则进入队列等待
httpApiThreadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, 0L,
TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(100), new ThreadFactoryBuilder().setNameFormat("PROS-%d").build());
}
/**
* 判断线程池内是否有空闲的线程
* @return
*/
public static boolean haveIdleThread(){
if(getActiveCount()<maximumPoolSize){
return true;
}
return false;
}
/**
* 获取当前活跃线程数
* @return
*/
public static int getActiveCount() {
System.out.println(((ThreadPoolExecutor) httpApiThreadPool).getActiveCount());
return ((ThreadPoolExecutor) httpApiThreadPool).getActiveCount();
}
}
注意:
1.阿里巴巴Java开发手册中明确指出:"线程池不允许使用Excutors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让程序员更加明确线程池的运行规则,避免资源耗尽的风险"。
2.new ThreadFactoryBuilder().setNameFormat("PROS-%d").build()
给每个线程命名,方便调试。
使用线程池
配合Java 8的lambdas表达式去使用:
HttpApiThreadPool.httpApiThreadPool.execute(
()->{
//do something...
}
);