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}