图解源码之FutureTask篇(AQS应用)

Posted dw-haung

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图解源码之FutureTask篇(AQS应用)相关的知识,希望对你有一定的参考价值。

技术分享图片

所以,FutureTask既可以由Executor来调度执行,也可以由调度线程调用FutureTask.run()直接执行。

技术分享图片

技术分享图片

技术分享图片

 

FutureTask是通过AQS的模板设计模式来实现阻塞get方法的。

 

技术分享图片

 

 

从get方法整个流程可以看出:

  • FutureTask维护一个等待线程队列waiters,如果task还未执行完毕,调用get方法的线程会先进入等待队列自旋等待;

  • awaitDone方法其实是个死循环,直到task状态变为已完成状态或者等待时间超过超时时间或者线程中断才会跳出循环,程序结束;

  • 为了节省开销,线程不会一直自旋等待,而是会阻塞,使用LockSupport的park系列方法实现线程阻塞;



技术分享图片

 

 技术分享图片

 FutureTask 等待和唤醒可作如下总结:

 技术分享图片

 



以上是关于图解源码之FutureTask篇(AQS应用)的主要内容,如果未能解决你的问题,请参考以下文章

Java 并发之AbstractQueuedSynchronizer(AQS)源码解析

AQS同步组件-FutureTask解析和用例

源码分析-FutureTask

源码分析-FutureTask

javajava 多线程 异步计算 FutureTask 源码详解

并发系列——FutureTask类源码简析