protected final void setImpl(ThreadPoolConfig cfg) {
if (cfg == null) {
throw new IllegalArgumentException("config is null");
}
cfg = cfg.copy();
final Queue<Runnable> queue = cfg.getQueue();
if ((queue == null || queue instanceof BlockingQueue) &&
(cfg.getCorePoolSize() < 0 || cfg.getCorePoolSize() == cfg.getMaxPoolSize())) {
this.pool = cfg.getQueueLimit() < 0
? new FixedThreadPool(cfg.getPoolName(), cfg.getMaxPoolSize(),
(BlockingQueue<Runnable>) queue,
cfg.getThreadFactory(), cfg.getMonitoringProbe())
: new QueueLimitedThreadPool(
cfg.getPoolName(), cfg.getMaxPoolSize(), cfg.getQueueLimit(),
cfg.getThreadFactory(),
(BlockingQueue<Runnable>) queue, cfg.getMonitoringProbe());
} else {
this.pool = new SyncThreadPool(cfg.getPoolName(), cfg.getCorePoolSize(),
cfg.getMaxPoolSize(), cfg.getKeepAliveTime(TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS,
cfg.getThreadFactory(), queue, cfg.getQueueLimit(),cfg.getMonitoringProbe());
}
this.config = cfg.updateFrom(pool);
}