package github.javaguide.utils.concurrent; import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * 创建 ThreadPool(线程池) 的工具类. * * @author shuang.kou * @createTime 2020年05月26日 16:00:00 */ public final class ThreadPoolFactoryUtils { /** * 线程池参数 */ private static final int CORE_POOL_SIZE = 10; private static final int MAXIMUM_POOL_SIZE_SIZE = 100; private static final int KEEP_ALIVE_TIME = 1; private static final int BLOCKING_QUEUE_CAPACITY = 100; private ThreadPoolFactoryUtils() { } public static ExecutorService createDefaultThreadPool(String threadNamePrefix) { return createDefaultThreadPool(threadNamePrefix, false); } public static ExecutorService createDefaultThreadPool(String threadNamePrefix, Boolean daemon) { // 使用有界队列 BlockingQueue workQueue = new ArrayBlockingQueue<>(BLOCKING_QUEUE_CAPACITY); ThreadFactory threadFactory = createThreadFactory(threadNamePrefix, daemon); return new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE_SIZE, KEEP_ALIVE_TIME, TimeUnit.MINUTES, workQueue, threadFactory); } /** * 创建 ThreadFactory 。如果threadNamePrefix不为空则使用自建ThreadFactory,否则使用defaultThreadFactory * * @param threadNamePrefix 作为创建的线程名字的前缀 * @param daemon 指定是否为 Daemon Thread(守护线程) * @return ThreadFactory */ private static ThreadFactory createThreadFactory(String threadNamePrefix, Boolean daemon) { if (threadNamePrefix != null) { if (daemon != null) { return new ThreadFactoryBuilder().setNameFormat(threadNamePrefix + "-%d").setDaemon(daemon).build(); } else { return new ThreadFactoryBuilder().setNameFormat(threadNamePrefix + "-%d").build(); } } return Executors.defaultThreadFactory(); } }