All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.buli_home.utils.thread.ThreadUtils Maven / Gradle / Ivy

package cn.buli_home.utils.thread;

import java.util.concurrent.*;

/**
 * 多线程工具
 *
 * @author mustard
 */
public class ThreadUtils {

    /**
     * 新建线程池
     * 
     *    1. 初始线程数为corePoolSize指定的大小
     *    2. 没有最大线程数限制
     *    3. 默认使用LinkedBlockingQueue,默认队列大小为1024
     * 
* * @param corePoolSize 同事执行的线程数 */ public static ExecutorService newExecutor(int corePoolSize) { ExecutorBuilder builder = ExecutorBuilder.create(); if (corePoolSize > 0) { builder.setCorePoolSize(corePoolSize); } return builder.build(); } /** * 获得一个新的线程池,默认的策略如下: *
     *    1. 初始线程数为 0
     *    2. 最大线程数为Integer.MAX_VALUE
     *    3. 使用SynchronousQueue
     *    4. 任务直接提交给线程而不保持它们
     * 
*/ public static ExecutorService newExecutor() { return ExecutorBuilder.create().useSynchronousQueue().build(); } /** * 获得一个新的线程池,只有单个线程,策略如下: *
     *    1. 初始线程数为 1
     *    2. 最大线程数为 1
     *    3. 默认使用LinkedBlockingQueue,默认队列大小为1024
     *    4. 同时只允许一个线程工作,剩余放入队列等待,等待数超过1024报错
     * 
*/ public static ExecutorService newSingleExecutor() { return ExecutorBuilder.create() .setCorePoolSize(1) .setMaxPoolSize(1) .setKeepAliveTime(0) .buildFinalizable(); } /** * 获得一个新的线程池
* 如果maximumPoolSize >= corePoolSize,在没有新任务加入的情况下,多出的线程将最多保留60s * * @param corePoolSize 初始线程池大小 * @param maximumPoolSize 最大线程池大小 */ public static ThreadPoolExecutor newExecutor(int corePoolSize, int maximumPoolSize) { return ExecutorBuilder.create() .setCorePoolSize(corePoolSize) .setMaxPoolSize(maximumPoolSize) .build(); } /** * 获得一个新的线程池,并指定最大任务队列大小
* 如果maximumPoolSize >= corePoolSize,在没有新任务加入的情况下,多出的线程将最多保留60s * * @param corePoolSize 初始线程池大小 * @param maximumPoolSize 最大线程池大小 * @param maximumQueueSize 最大任务队列大小 */ public static ExecutorService newExecutor(int corePoolSize, int maximumPoolSize, int maximumQueueSize) { return ExecutorBuilder.create() .setCorePoolSize(corePoolSize) .setMaxPoolSize(maximumPoolSize) .setWorkQueue(new LinkedBlockingQueue<>(maximumQueueSize)) .build(); } /** * 获取一个新的线程池,默认的策略如下
*
     *     1. 核心线程数与最大线程数为nThreads指定的大小
     *     2. 默认使用LinkedBlockingQueue,默认队列大小为1024
     *     3. 如果isBlocked为{@code true},当执行拒绝策略的时候会处于阻塞状态,直到能添加到队列中或者被{@link Thread#interrupt()}中断
     * 
* * @param nThreads 线程池大小 * @param threadNamePrefix 线程名称前缀 * @param isBlocked 是否使用{@link BlockPolicy}策略 * @return ExecutorService */ public static ExecutorService newFixedExecutor(int nThreads, String threadNamePrefix, boolean isBlocked) { return newFixedExecutor(nThreads, 1024, threadNamePrefix, isBlocked); } /** * 获取一个新的线程池,默认的策略如下
*
     *     1. 核心线程数与最大线程数为nThreads指定的大小
     *     2. 默认使用LinkedBlockingQueue
     *     3. 如果isBlocked为{@code true},当执行拒绝策略的时候会处于阻塞状态,直到能添加到队列中或者被{@link Thread#interrupt()}中断
     * 
* * @param nThreads 线程池大小 * @param maximumQueueSize 队列大小 * @param threadNamePrefix 线程名称前缀 * @param isBlocked 是否使用{@link BlockPolicy}策略 * @return ExecutorService * */ public static ExecutorService newFixedExecutor(int nThreads, int maximumQueueSize, String threadNamePrefix, boolean isBlocked) { return newFixedExecutor(nThreads, maximumQueueSize, threadNamePrefix, (isBlocked ? RejectPolicy.BLOCK : RejectPolicy.ABORT).getValue()); } /** * 获得一个新的线程池,默认策略如下
*
     *     1. 核心线程数与最大线程数为nThreads指定的大小
     *     2. 默认使用LinkedBlockingQueue
     * 
* * @param nThreads 线程池大小 * @param maximumQueueSize 队列大小 * @param threadNamePrefix 线程名称前缀 * @param handler 拒绝策略 * @return ExecutorService * */ public static ExecutorService newFixedExecutor(int nThreads, int maximumQueueSize, String threadNamePrefix, RejectedExecutionHandler handler) { return ExecutorBuilder.create() .setCorePoolSize(nThreads).setMaxPoolSize(nThreads) .setWorkQueue(new LinkedBlockingQueue<>(maximumQueueSize)) .setThreadFactory(createThreadFactory(threadNamePrefix)) .setHandler(handler) .build(); } /** * 创建自定义线程名称前缀的{@link ThreadFactory} * * @param threadNamePrefix 线程名称前缀 * @return {@link ThreadFactory} * @see ThreadFactoryBuilder#build() * */ public static ThreadFactory createThreadFactory(String threadNamePrefix) { return ThreadFactoryBuilder.create().setNamePrefix(threadNamePrefix).build(); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy