dubbo使用了三个线程池作为控制,如下图
首先挨个简单介绍:
FixedThreadPool
代码内给的注释:
此线程池启动时即创建固定大小的线程数,不做任何伸缩,来源于:Executors.newFixedThreadPool()
代码学习
public class FixedThreadPool implements ThreadPool {
//依然是URL总线模式,更加URL参数进行解析
public Executor getExecutor(URL url) {
//基本参数 name=threadname+Dubbo
String name = url.getParameter(Constants.THREAD_NAME_KEY,
Constants.DEFAULT_THREAD_NAME);
//基本参数 threads=threads+200
int threads = url.getParameter(Constants.THREADS_KEY, Constants.DEFAULT_THREADS);
//基本参数 queues=queues+0
int queues = url.getParameter(Constants.QUEUES_KEY, Constants.DEFAULT_QUEUES);
return new ThreadPoolExecutor(threads, threads, 0, TimeUnit.MILLISECONDS,
queues == 0 ? new SynchronousQueue() :
(queues < 0 ? new LinkedBlockingQueue()
: new LinkedBlockingQueue(queues)),
new NamedThreadFactory(name, true), new AbortPolicyWithReport(name, url));
}
以下摘在jdk
ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
用给定的初始参数创建新的
ThreadPoolExecutor。
参数:
corePoolSize - 池中所保存的线程数,包括空闲线程。
maximumPoolSize - 池中允许的最大线程数。
keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。
unit - keepAliveTime 参数的时间单位。
workQueue - 执行前用于保持任务的队列。此队列仅保持由
execute 方法提交的
Runnable 任务。
threadFactory - 执行程序创建新线程时使用的工厂。
handler - 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。
抛出:
IllegalArgumentException - 如果 corePoolSize 或 keepAliveTime 小于 0,或者 maximumPoolSize
小于等于 0,或者 corePoolSize 大于 maximumPoolSize。
NullPointerException - 如果
workQueue、 threadFactory 或
handler 为 null。
由此可见默认创建了线程池为固定值200,当超容量时,发送警告信息
String msg = String.format("Thread pool is EXHAUSTED!" +
" Thread Name: %s, Pool Size: %d (active: %d, core:
%d, max: %d, largest: %d), Task: %d (completed: %d)," +
" Executor status:(isShutdown:%s, isTerminated:%s, isTerminating:%s), in %s://%s:%d!" ,
threadName, e.getPoolSize(), e.getActiveCount(), e.getCorePoolSize(), e.getMaximumPoolSize(), e.getLargestPoolSize(),
e.getTaskCount(), e.getCompletedTaskCount(), e.isShutdown(), e.isTerminated(), e.isTerminating(),
url.getProtocol(), url.getIp(), url.getPort());
logger.warn(msg);
throw new RejectedExecutionException(msg);
同理其他LimitedThreadPool CachedThreadPool