以ThreadPoolExecutor类的 public <T> Future<T> submit(Runnable task, T result) 方法为例简单梳理一下流程。
通过该文希望做两件事,1是理清是怎么拿到线程的执行结果的,2线程任务的提交流程。
ThreadPoolExecutor继承AbstractExecutorService,改submit方法来自AbstractExecutorService。打开AbstractExecutorService看一下submit实现。
图1
在上图中我们可以看到execute方法传入的是一个newTaskFor方法返回的RunableFuture对象,该对象实际上是FutureTask。同时我们也可以看到submit的返回的其实也是FutureTask对象,也就不难理解为什么能拿到线程的执行结果了。Thread.start()会调用在Runbale的run方法,也就是这里的FutureTask的Run方法。submit返回的也是FutureTask对象,两者是同一个对象,能拿到自己方法的执行结果也是很正常的事了。
FutureTask的继承关系如下图:
FutureTask的构造方法如下图,我们可以到将Runnable转换成了Callable。
Runnable转Callable的具体实现如下图,可以看到call的返回值是构造submit时提交的结果。如果在submit时传的是Callable的实现当然在FutureTask的run方法中的调用calld的时候调用的是Callable的call方法。
FutureTask 的run方法如下图
上面大概解释了怎么拿到线程的执行结果,再来看一下任务怎么提交到线程池的。
提交的动作实在图一的execute方法。在这个方法中,有三个重要方法,addWorker 创建线程,wokeQueue.offer() 将任务加入队列,reject拒绝任务。
Worker的创建,调用了在创建线程池时传入的线程工厂来创建线程,如果没有传入线程工程则使用默认工厂。