package com.ruoyi.dk.executor;

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

import java.util.concurrent.*;

/**
 * 线程变量定义
 * <p>created on 2023/3/3 11:16</p>
 * @author ZL
 */
public class ExecutorConstant {

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

    public static Executor SYNC_EXECUTOR;

    public static Executor COMMON_EXECUTOR;

    static {
        ThreadPoolExecutor syncExecutor = initExecutor(CPU_NUM,
                CPU_NUM << 2,
                5,
                TimeUnit.SECONDS,
                new SynchronousQueue<>(),
                "syncThreadPool-%d");
        SYNC_EXECUTOR = TtlExecutors.getTtlExecutor(syncExecutor);

        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);
    }

    public static void main(String[] args) {
        System.out.println(6 << 2);
    }

    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));
    }
}
