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}