public class Test {
/**
* 获得一个线程池
* @param coreCount 核心线程数量
* @param maxCount 最大线程数量
* @param queueLength 队列长度
* @param nameProfile 线程名字前缀
* @param rejectedExecutionHandler 超出策略
* @return ThreadPoolTaskExecutor
*/
public static ThreadPoolTaskExecutor buildThreadPool(int coreCount, int maxCount, int queueLength,
String nameProfile, RejectedExecutionHandler rejectedExecutionHandler){
if(rejectedExecutionHandler == null){
rejectedExecutionHandler = new ThreadPoolExecutor.CallerRunsPolicy();
}
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(coreCount);
//配置最大线程数
executor.setMaxPoolSize(maxCount);
//配置队列大小
executor.setQueueCapacity(queueLength);
//配置线程池中的线程的名称前缀
executor.setThreadNamePrefix(nameProfile + "TP-");
executor.setRejectedExecutionHandler(rejectedExecutionHandler);
executor.initialize();
return executor;
}
/**
* 获得一个线程池,超出策略为在当前线程执行
* @param coreCount 核心线程数量
* @param maxCount 最大线程数量
* @param queueLength 队列长度
* @param nameProfile 线程名字前缀
* @return ThreadPoolTaskExecutor
*/
public static ThreadPoolTaskExecutor buildThreadPool(int coreCount, int maxCount, int queueLength, String nameProfile){
//线程池超出时默认以调用者线程执行
RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.CallerRunsPolicy();
return buildThreadPool(coreCount, maxCount, queueLength, nameProfile,rejectedExecutionHandler);
}
public static void main(String[] args) {
ThreadPoolTaskExecutor threadPoolTaskExecutor=buildThreadPool(10,50,62,"test_");
for(int i=0;i<200;i++){
threadPoolTaskExecutor.execute(new RunnableS(i));
}
}
}
public class RunnableS implements Runnable {
private int i;
@Override
public void run() {
//System.out.println("::::::i::::::"+i);
if(i<52){
try {
Thread.sleep( 50000);
System.out.println(Thread.currentThread().getName()+"暂停线程------i:="+i+"|||-------------");
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
System.out.println(Thread.currentThread().getName()+"直接输出线程-----i:="+i+" |||--------------");
}
}
public RunnableS(int i) {
super();
this.i = i;
}
}
基本上就是 项目启动创建核心线程数,当任务达到队列数时,会在核心线程数之外创建 核心线程数到最大线程数个线程:
如核心线程数为10个 最大线程数为50 那么当队列满值以后 (52+核心线程数10个) 在线程到到 62个的时候创建 第 11个线程。
具体解释查看 :https://zhuanlan.zhihu.com/p/35188214 文章给到启发 自己做了测试。