/** * 枚举单例 线程池 如果多处使用该方法,则不可以shutDown */ public enum EnumThread { /** * 线程(单例不可以创建两个枚举实例,如果常见两个枚举实力,执行是,会调用两次想要单例的方法) */ EXECUTOR_POOL;//因为枚举实例变量需要枚举类的构造器创建,所以,构造器没有形参,枚举实例参数EXECUTOR_POOL 也不用写成 //EXECUTOR_POOL("参数") 该形式,; /** * ExecutorService 接口作为返回类型 */ private final ExecutorService maxExecutor; private final ExecutorService minExecutor; EnumThread() { System.out.println("11"); ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("funinbook-pool-%d").build(); maxExecutor = new ThreadPoolExecutor( CORE_POOL_SIZE67, CORE_POOL_SIZE87, 10, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy() ); minExecutor = new ThreadPoolExecutor( CORE_POOL_SIZE7, CORE_POOL_SIZE27, 10, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy() ); } /** * 线程数最大77 最小 57 * * @return */ public ExecutorService getMaxExecutor() { return maxExecutor; } /** * 线程数最大7 最小 7 * * @return */ public ExecutorService getMinExecutor() { return minExecutor; } }
下面是测试,用两个枚举实例变量会调用两次想要单例的方法实例
class Test{
//main 方法调用枚举类10次,会发现“会调用两次”会输出两次,所以,想要用枚举类写单例,一定要像上面那样,只用一个枚举实例
public static void main(String[] args) {
for (int i = 0; i <10 ; i++) {
for (int j = 0; j < 10; j++) {
ThreadPoolManager.EnumThread.EXECUTOR_POOL.getMaxExecutor();
}
}
}
/**
* 枚举单例 线程池 如果多处使用该方法,则不可以shutDown
*/
public enum EnumThread {
/**
* 线程(单例不可以创建两个枚举实例,如果常见两个枚举实力,执行是,会调用两次想要单例的方法)
*/
EXECUTOR_POOL,
EXECUTOR_POOL_MAX;
/**
* ExecutorService 接口作为返回类型
*/
private final ExecutorService maxExecutor;
private final ExecutorService minExecutor;
EnumThread() {
System.out.println("会调用两次");
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("funinbook-pool-%d").build();
maxExecutor = new ThreadPoolExecutor(
CORE_POOL_SIZE67,
CORE_POOL_SIZE87,
10,
TimeUnit.MILLISECONDS,
new LinkedBlockingDeque<Runnable>(1024),
namedThreadFactory,
new ThreadPoolExecutor.AbortPolicy()
);
minExecutor = new ThreadPoolExecutor(
CORE_POOL_SIZE7,
CORE_POOL_SIZE27,
10,
TimeUnit.MILLISECONDS,
new LinkedBlockingDeque<Runnable>(1024),
namedThreadFactory,
new ThreadPoolExecutor.AbortPolicy()
);
}
/**
* 线程数最大77 最小 57
*
* @return
*/
public ExecutorService getMaxExecutor() {
return maxExecutor;
}
/**
* 线程数最大7 最小 7
*
* @return
*/
public ExecutorService getMinExecutor() {
return minExecutor;
}
}
}