java中一个线程的执行结果使用接口future 来接收结果,在开始分析源码之前我们先看看future的运用,然后一步步的分析:
我们可以看到,我们传入的Callable接口最后被封装在一个RunnableFuture中,RunnableFuture集成了Runnale和Future接口,他的实现之一是FutureTask
RunnbaleFuture种的接口重写了Runable中的run方法,在实现类调用run方法的时候优先调用
execute方法就是一个线程的execute方法 ,关键的地方在runWorker的run方法的调用。
上面说过,我们提交的Callable 任务被封装成了一个实现了Runable接口的FutureTask任务,所以,上面图中的红框中task其实死一个FutureTask对象,调用的是FutureTask中的run方法。
我们从上面的set方法中看到一个方法finishCompletion(),这个方法才是真真的把线程执行的结果封装返回给外部线程的核心方法,在进行这个方法的分析之前我们需要对这个对另外一个方法先分析一波。那个方法就是get(),获取线程池执行的结果的方法;
所以调用get方法的时候要么立即返回要么,被阻塞。所有调用get方法可能会生成一个等待节点的单线链表,到了这个时候我们就可以来分析上面我们暂时还没有分析的那个方法 finishCompletion()。
到了这里Java的Future异步执行和结果封装就已经结束了
Java Future类结构图: