package net.csdn.modules.threadpool; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import com.google.inject.Inject; import net.csdn.common.settings.Settings; import net.csdn.common.unit.TimeValue; import java.util.Map; import java.util.concurrent.*; /** * BlogInfo: william * Date: 11-9-5 * Time: 下午4:49 */ public class DefaultThreadPoolService implements ThreadPoolService { private Settings settings; @Inject public DefaultThreadPoolService(Settings settings) { this.settings = settings; Map<String, Executor> executors = Maps.newHashMap(); executors.put(Names.SEARCH, build(Names.SEARCH)); executors.put(Names.REFRESH, build(Names.REFRESH)); executors.put(Names.CACHED, buildCache(Names.CACHED)); this.executors = ImmutableMap.copyOf(executors); this.scheduler = Executors.newScheduledThreadPool(1, Executors.defaultThreadFactory()); } public <T> T runWithTimeout(int timeValue, final Run<T> run) { FutureTask<T> futureTask = new FutureTask(new Callable<T>() { @Override public T call() throws Exception { return run.run(); } }); executor(Names.CACHED).execute(futureTask); try { return futureTask.get(timeValue, TimeUnit.MILLISECONDS); } catch (Exception e) { //ingore } return null; } public DefaultThreadPoolService start() { // scheduler.scheduleWithFixedDelay(new Runnable() { // @Override // public void run() { // Map<String,IndexEngine> maps = Cache.cache(Map.class,Cache.Names.INDEX_WRITER); // if(maps.size()>0){ // for(Map.Entry<String,IndexEngine> entry:maps.entrySet()){ // IndexEngine engine = entry.getValue(); // engine.refresh(); // } // } // } // },settings.getAsInt("index.setting.refresh_delay",10),settings.getAsInt("index.setting.refresh_interval",5),TimeUnit.SECONDS); return this; } public Executor executor(String name) { Executor executor = executors.get(name); if (executor == null) { throw new IllegalArgumentException("No executor found for [" + name + "]"); } return executor; } public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, TimeValue interval) { return scheduler.scheduleWithFixedDelay(command, interval.millis(), interval.millis(), TimeUnit.MILLISECONDS); } public void shutdown() { scheduler.shutdown(); for (Executor executor : executors.values()) { if (executor instanceof ThreadPoolExecutor) { ((ThreadPoolExecutor) executor).shutdown(); } } } public void shutdownNow() { scheduler.shutdownNow(); for (Executor executor : executors.values()) { if (executor instanceof ThreadPoolExecutor) { ((ThreadPoolExecutor) executor).shutdownNow(); } } } public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException { boolean result = scheduler.awaitTermination(timeout, unit); for (Executor executor : executors.values()) { if (executor instanceof ThreadPoolExecutor) { result &= ((ThreadPoolExecutor) executor).awaitTermination(timeout, unit); } } return result; } public Executor build(String name) { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 5, TimeUnit.MINUTES, new SynchronousQueue<Runnable>(), Executors.defaultThreadFactory()); } public Executor buildCache(String name) { return new ThreadPoolExecutor(5, 1000, 1, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), Executors.defaultThreadFactory()); } private final ImmutableMap<String, Executor> executors; private final ScheduledExecutorService scheduler; }