首页 > 其他 > 详细

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

时间:2018-07-11 10:06:38      阅读:165      评论:0      收藏:0      [点我收藏+]

技术分享图片

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

技术分享图片

技术分享图片

技术分享图片

 

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

 

技术分享图片

 

 

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

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

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

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



技术分享图片

 

 技术分享图片

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

 技术分享图片

 

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

原文:https://www.cnblogs.com/dw-haung/p/9292896.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!