 new one will take its place if
     * needed to execute subsequent tasks.  The threads in the pool will
     * exist until it is explicitly {@link ExecutorService#shutdown
     * shutdown}.
     *
     * @param nThreads      the number of threads in the pool
     * @param threadFactory the factory to use when creating new threads
     *
     * @return the newly created thread pool
     *
     * @throws NullPointerException     if threadFactory is null
     * @throws IllegalArgumentException if {@code nThreads <= 0}
     */
    /*
     *【固定容量线程池】，允许自行指定线程工厂
     *
     * 线程池中常驻线程数量为nThreads
     *
     * 配置：
     * - 阻塞队列   : LinkedBlockingQueue
     * -【核心阙值】: nThreads
     * -【最大阙值】: nThreads
     */
    public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
        return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory);
    }
    
    
    /**
     * Creates a thread pool that can schedule commands to run after a
     * given delay, or to execute periodically.
     *
     * @param corePoolSize the number of threads to keep in the pool,
     *                     even if they are idle
     *
     * @return the newly created scheduled thread pool
     *
     * @throws IllegalArgumentException if {@code corePoolSize < 0}
     */
    /*
     *【定时任务线程池】
     *
     * 用于执行一次性或周期性的定时任务
     *
     * 配置：
     * - 阻塞队列   : DelayedWorkQueue
     * -【核心阙值】: corePoolSize
     * -【最大阙值】: 无限
     */
    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }
    
    /**
     * Creates a thread pool that can schedule commands to run after a
     * given delay, or to execute periodically.
     *
     * @param corePoolSize  the number