001package net.gdface.utils; 002 003import java.util.concurrent.ExecutorService; 004import java.util.concurrent.LinkedBlockingQueue; 005import java.util.concurrent.ScheduledExecutorService; 006import java.util.concurrent.ScheduledThreadPoolExecutor; 007import java.util.concurrent.ThreadPoolExecutor; 008import java.util.concurrent.TimeUnit; 009 010import com.google.common.base.MoreObjects; 011import com.google.common.util.concurrent.MoreExecutors; 012import com.google.common.util.concurrent.ThreadFactoryBuilder; 013 014/** 015 * 提供全局线程池对象<br> 016 * 线程池对象在应用程序结束时自动退出 017 * @author guyadong 018 * 019 */ 020public class DefaultExecutorProvider{ 021 private static final int CACHE_COREPOOLSIZE = Runtime.getRuntime().availableProcessors(); 022 private static final int CACHE_MAXIMUMPOOLSIZE = Runtime.getRuntime().availableProcessors()*4; 023 private static final long CACHE_KEEPALIVETIME = 60L; 024 private static final int CACHE_QUEUECAPACITY = 1024; 025 private static final String CACHE_NAMEFORMAT = "cached-pool-%d"; 026 private static final int CACHE_TIMER_COREPOOLSIZE = 1; 027 private static final String TIMER_NAMEFORMAT = "timer-pool-%d"; 028 029 private static class Singleton{ 030 private static final DefaultExecutorProvider INSTANCE = new DefaultExecutorProvider(); 031 } 032 /** 全局线程池(自动退出封装) */ 033 protected final ExecutorService globalExecutor = createExitingCachedPool(); 034 /** 定时任务线程池对象(自动退出封装) */ 035 protected final ScheduledExecutorService timerExecutor = createExitingScheduledPool(); 036 /** 根据配置文件指定的参数创建通用任务线程池对象 */ 037 protected static final ExecutorService createCachedPool( 038 Integer corePoolSize, 039 Integer maximumPoolSize, 040 Long keepAliveTime, 041 Integer queueCapacity, 042 String nameFormat ){ 043 ExecutorService executor = MoreExecutors.getExitingExecutorService( 044 new ThreadPoolExecutor( 045 MoreObjects.firstNonNull(corePoolSize, CACHE_COREPOOLSIZE), 046 MoreObjects.firstNonNull(maximumPoolSize, CACHE_MAXIMUMPOOLSIZE), 047 MoreObjects.firstNonNull(keepAliveTime, CACHE_KEEPALIVETIME), 048 TimeUnit.SECONDS, 049 new LinkedBlockingQueue<Runnable>(MoreObjects.firstNonNull(queueCapacity,CACHE_QUEUECAPACITY)), 050 new ThreadFactoryBuilder() 051 .setNameFormat(MoreObjects.firstNonNull(nameFormat,CACHE_NAMEFORMAT)) 052 .build()) 053 ); 054 return executor; 055 } 056 /** 根据配置文件指定的参数创建定时任务线程池对象 */ 057 protected static final ScheduledExecutorService createScheduledPool(Integer corePoolSize,String nameFormat){ 058 ScheduledExecutorService timerExecutor = MoreExecutors.getExitingScheduledExecutorService( 059 new ScheduledThreadPoolExecutor( 060 MoreObjects.firstNonNull(corePoolSize, CACHE_TIMER_COREPOOLSIZE), 061 new ThreadFactoryBuilder() 062 .setNameFormat(MoreObjects.firstNonNull(nameFormat,TIMER_NAMEFORMAT)) 063 .build())); 064 return timerExecutor; 065 } 066 /** 067 * 创建一个自动退出封装的全局线程池, 068 * 子类可以使用不同的参数调用{@link #createCachedPool(Integer, Integer, Long, Integer, String)}重写此方法 069 * @return 070 */ 071 protected ExecutorService createExitingCachedPool() { 072 return createCachedPool(null,null,null,null,null); 073 } 074 /** 075 * 创建一个自动退出封装的定时任务线程池, 076 * 子类可以使用不同的参数调用{@link #createScheduledPool(Integer, String)}重写此方法 077 * @return 078 */ 079 protected ScheduledExecutorService createExitingScheduledPool() { 080 return createScheduledPool(null,null); 081 } 082 protected DefaultExecutorProvider() { 083 } 084 /** 返回全局线程池 */ 085 public static ExecutorService getGlobalExceutor() { 086 return Singleton.INSTANCE.globalExecutor; 087 } 088 /** 返回定时任务线程池 */ 089 public static ScheduledExecutorService getTimerExecutor() { 090 return Singleton.INSTANCE.timerExecutor; 091 } 092}