自定义线工厂需要实现ThreadFactory接口
package com.liyajie.util;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 自定义线程工厂
* @author 李亚杰
* @date 2024/5/24 下午3:38
* @description CustomNameThreadFactory
*/
public class CustomNameThreadFactory implements ThreadFactory {
private static final AtomicInteger poolNumber = new AtomicInteger(1);
private final ThreadGroup group;
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;
CustomNameThreadFactory(String name) {
SecurityManager s = System.getSecurityManager();
group = (s != null) ? s.getThreadGroup() :
Thread.currentThread().getThreadGroup();
if (name==null|| name.isEmpty()){
name = "pool";
}
namePrefix = name+"-" +
poolNumber.getAndIncrement() +
"-thread-";
}
@Override
public Thread newThread(Runnable r) {
//定义线程名称
Thread t = new Thread(group, r,
namePrefix + threadNumber.getAndIncrement(),
0);
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
}
通过枚举实现线程池的创建
package com.liyajie.util;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @author 李亚杰
* @date 2024/5/31 上午9:50
* @description ExecutorsEnum
*/
public enum ExecutorsEnum {
DEFAULT_POOL(10,50,5,"default"),
TEST_POOL(10,50,5,"test");
/**
* 线程数
*/
final int corePoolSize;
/**
* 最大线程数
*/
final int maximumPoolSize;
/**
* 最大等待时间,秒
*/
final long keepAliveTime;
/**
* 名称
*/
final String name;
final ThreadPoolExecutor threadPoolExecutor;
ExecutorsEnum(int corePoolSize, int maximumPoolSize, long keepAliveTime, String name) {
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.keepAliveTime = keepAliveTime;
this.name = name;
this.threadPoolExecutor = new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(40),
new CustomNameThreadFactory(name),
new ThreadPoolExecutor.CallerRunsPolicy()
);
}
public ThreadPoolExecutor getThreadPoolExecutor() {
return threadPoolExecutor;
}
}
在使用线程池时,通过调用get方法即可获取线程池