码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-07-11 10:34:48      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:div   维护   图片   直接   info   future   完成   方法   .com   

技术分享图片

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

技术分享图片

技术分享图片

技术分享图片

 

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

 

技术分享图片

 

 

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

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

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

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



技术分享图片

 

 技术分享图片

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

 技术分享图片

 

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

标签:div   维护   图片   直接   info   future   完成   方法   .com   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!