@Override
public void afterPropertiesSet() throws Exception {
nThreads = nThreads <= 0 ? DEFAULT_THREADS : nThreads;
executor = new ThreadPoolExecutor(nThreads, nThreads, 0, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(nThreads * 2),
new NamedThreadFactory("global monitor", false),
new ThreadPoolExecutor.CallerRunsPolicy());
}