package com.boman.domain.utils;

import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.springframework.stereotype.Service;

import java.util.concurrent.*;

/**
 * @author shiqian
 * @desc 线程池
 * @date 2021年09月09日 14:56
 **/
@Service
public class ThreadPoolService {

    /**
     * 自定义线程名称,方便的出错的时候溯源
     */
    private static final ThreadFactory THREAD_FACTORY = new ThreadFactoryBuilder().setNameFormat("myself-pool-%d").build();


    /**
     * 功能描述:
     *
     * @param corePoolSize    线程池核心池的大小
     * @param maximumPoolSize 线程池中允许的最大线程数量
     * @param keepAliveTime   当线程数大于核心时，此为终止前多余的空闲线程等待新任务的最长时间
     * @param unit            keepAliveTime 的时间单位
     * @param workQueue       用来储存等待执行任务的队列
     * @param threadFactory   创建线程的工厂类
     * @param handler         拒绝策略类,当线程池数量达到上线并且workQueue队列长度达到上限时就需要对到来的任务做拒绝处理
     * @return ExecutorService
     */
    private static final ExecutorService EXECUTOR_SERVICE = new ThreadPoolExecutor(
            4,
            40,
            0L,
            TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<>(1024),
            THREAD_FACTORY,
            new ThreadPoolExecutor.AbortPolicy()
    );

    /**
     * 获取线程池
     *
     * @return 线程池
     */
    private static ExecutorService getEs() {
        return EXECUTOR_SERVICE;
    }

    /**
     * 使用线程池创建线程并异步执行任务 ps:无返回值
     *
     * @param runnable 任务
     */
    public static void execute(Runnable runnable) {
        getEs().execute(runnable);
    }
}

