package com.ruoyi.component.core.executor;

import com.alibaba.ttl.threadpool.TtlExecutors;
import com.google.common.util.concurrent.ThreadFactoryBuilder;

import java.util.concurrent.*;

public class ExecutorConstant {

    private final static int CPU_NUM = Runtime.getRuntime().availableProcessors();

    public static Executor COMMON_EXECUTOR;

    static {
        ThreadPoolExecutor commonExecutor = new ThreadPoolExecutor(CPU_NUM,
                CPU_NUM << 2,
                5,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(50),
                init("commonThreadPool-%d"),
                new ThreadPoolExecutor.CallerRunsPolicy());
        COMMON_EXECUTOR = TtlExecutors.getTtlExecutor(commonExecutor);
    }

    private static ThreadFactory init(String nameFormat){
        return new ThreadFactoryBuilder().setNameFormat(nameFormat).build();
    }

    private static ThreadPoolExecutor initExecutor(int corePoolSize, int maxPoolSize, int keepAliveTime, TimeUnit timeUnit,
                                         BlockingQueue<Runnable> workQueue, String nameFormat){
        return new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, timeUnit, workQueue,
                init(nameFormat));
    }
}
