package com.pingcap.syngmail.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author zhuxiaopeng
 * @version 1.0.0
 * @Description 线程池
 * @createTime 2022年04月20日 16:35:00
 */
@Configuration
public class ThreadPoolConfig {
    @Bean
    public ThreadPoolExecutor initThreadPool() {
        // CPU 获取电脑数量
        int cpuCount = Runtime.getRuntime().availableProcessors();

        System.out.println("cpu-count="+cpuCount);

        // 初始线程数
        int corePoolSize = cpuCount;

        // 最大线程池大小
        int maximumPoolSize = 30;

        // 线程最大空闲时间
        long keepAliveTime = 60;

        // 时间单位:  秒
        TimeUnit unit = TimeUnit.SECONDS;

        // 线程等待队列
        SynchronousQueue<Runnable> workQueue = new SynchronousQueue<>();

        // 线程序列
        AtomicInteger atomicInteger = new AtomicInteger(1);

        // 线程工厂
        ThreadFactory namedThreadFactory = (Runnable r) -> new Thread(r, "thread-" + atomicInteger.getAndIncrement());

        // 创建线程池
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, namedThreadFactory);

        // 预启动线程池
        threadPool.prestartAllCoreThreads();

        // 返回线程池.
        return threadPool;
    }
}
