所以,FutureTask既可以由Executor来调度执行,也可以由调度线程调用FutureTask.run()直接执行。
FutureTask是通过AQS的模板设计模式来实现阻塞get方法的。
从get方法整个流程可以看出:
-
FutureTask维护一个等待线程队列waiters,如果task还未执行完毕,调用get方法的线程会先进入等待队列自旋等待;
-
awaitDone方法其实是个死循环,直到task状态变为已完成状态或者等待时间超过超时时间或者线程中断才会跳出循环,程序结束;
-
为了节省开销,线程不会一直自旋等待,而是会阻塞,使用LockSupport的park系列方法实现线程阻塞;
![](https://images2018.cnblogs.com/blog/1403971/201807/1403971-20180711094333613-610381735.png)
![](https://images2018.cnblogs.com/blog/1403971/201807/1403971-20180711094553273-384864296.png)
FutureTask 等待和唤醒可作如下总结: