//实例化一个 FutureTask,交给子类的 execute 方法执行.这种设计能够保证
callable 和 runnable 的执行接口方法的一致性(FutureTask 包装了这个差别)
public <T> Future<T> submit(Runnable task, T result) {
if (task
== null) throw new NullPointerException();
RunnableFuture<T> ftask = newTaskFor(task,
result);
protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value)
{
return new FutureTask<T>(runnable, value);
关于 FutureTask 这个类的实现,我在前面的 JAVA LOCK 代码浅析有讲过其实现原理,主要的思想
就是关注任务完成与未完成的状态,任务提交线程 get()结果时被 park 住,等待任务执行完成被唤
醒,任务执行线程在任务执行完毕后设置结果,并且 unpark 对应线程并且让其得到执行结果.
回到 ThreadPoolExecutor 类.ThreadPoolExecutor 需要实现除了我们刚才说的 execute(Runnable
command)方法外,还得实现 ExecutorService 接口定义的部分方法.但 ThreadPoolExecutor 所提
供的不光是这些,以下根据我的理解来列一下它所具有的特性
1. execute 流程
2. 池
3. 工作队列
4. 饱和拒绝策略
5. 线程工厂
6. beforeExecute 和 afterExecute 扩展
execute 方法的实现有个机制非常重要,当当前线程池线程数量小于 corePoolSize,那么生成一个
新的 worker并把提交的任务置为这个工作线程的头一个执行任务,如果大于corePoolSize,那么会
试着将提交的任务塞到 workQueue 里面供线程池里面的 worker 稍后执行,并不是直接再起一个
评论0
最新资源