以前常常使用JDK提供的各种并发库类
编码,却很少去看源代码。写这篇文章主要还是为了强迫自己把学习Java源代码的一些要点记录下来。
构造函数:
ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<
Runnable> workQueue,
ThreadFactory
threadFactory,
RejectedExecutionHandler handler)
参数含义:
corePoolSize
线程池里面保存的
最多可以闲置的线程数量。allowCoreThreadTimeOut被调用后,则没有线程能够在timeout后还保存
在线程池里
maximumPoolSize 线程池里面保存最多的线程数量
keepAliveTime,unit 当线程池里面保存的线程数量大于corePoolSize后,闲置的线程等待最大指定的时间(然后被关闭)
workQueue 用来保存被提交的任务
threadFactory 用来创建新线程的factory
handler 当所有线程都在执行任务并且workQueue已经满了,handler处理新提交进来的任务
JDK 自带的 RejectedExecutionHandler 实现有4个:AbortPolicy, CallerRunsPolicy, DiscardOldestPolicy, DiscardPolicy。
AbortPolicy 是默认策略直接 throw RejectedExecutionException
CallerRunsPolicy 当Executor没有被关闭,则直接由提交任务的线程直接运行
DiscardOldestPolicy 当Executor没有被关闭,从workQueue里面删除等待最久的一个任务,然后再调用execute
DiscardPolicy 当前任务被直接抛弃
Future submit(Callable task)
这个方法的实现在父类AbstractExecutor
Service里面:
1. 用Callable task去创建了FutureTask实例。FutureTask是RunnableFuture
接口的实现类,即实现了Runnable接口,也实现了Future接口。
2. 用FutureTask实例调用子类execute(Runnable
command),(execute方法在ThreadPoolExecutor里的实现,后续再写)
3. 把FutureTask实例返回
Future submit(Runnable task, T result)
这个方法的实现也在父类AbstractExecutorService里面:
1. 用Runnable task和result去创建了FutureTask实例(成功执行task后,返回result)。
2. 用FutureTask实例调用子类execute(Runnable command),(execute方法在ThreadPoolExecutor里的实现,后续再写)
3. 把FutureTask实例返回