FutureTask源码详解(JDK1.7)

FutureTask常常用于包装任务,提交给Executor执行,本博客介绍JDK1.7的实现

继承结构

实现

FutureTask对外方法

FutureTask对外方法都通过内部类Sync来实现

 

 

Sync内部类实现

 

 

 

 

 

总结

通过内部继承AQS的一个私有类Sync来实现操作代理的;Sync 实现了AQS的tryAcquireShared()和tryReleaseShared()方法

FutureTask代的get()方法代理到AQS的acquireSharedInterruptibly()方法上

这个方法内部回调重写的tryAcquireShared()方法来判断acquire操作是否可以成功。

  • 成功的条件为:state为执行完成状态RAN或已取消CANCELLED,且runner不为null。
  • 如果成功则从get()方法返回,失败则进入AQS等待队列中,直到其他线程release(run,cancel)。
  • 当其他线程执行AQS的release方法唤醒当前线程后,当前线程再次执行tryAcquireShared()方法将返回1(大于0的数表示成功),当前线程离开等待队列并唤醒后继线程(级联唤醒的效果)。
  • 最后返回计算的结果或者抛出异常。

FutureTask的run()和cancel()方法代理到AQS的release()方法上

release()会回调tryReleaseShared()方法,看一下run方法的执行过程:

  • 执行任务(Callable.call());
  • 以原子的方式更新同步状态,如果这个操作成功就设置代表计算结果的变量result的值为Callable.call()的返回值,然后调用AQS的releaseShared()方法释放同步状态
  • 先回调tryReleaseShared()方法,设置运行任务的线程为null,然后返回true。
  • 然后执行AQS.releaseShared()方法,唤醒线程等待队列中的第一个线程(第一个被唤醒后,后面依次被唤醒)
  • 执行FutureTask.done()方法,这是一个空方法。可以用来在这个方法内查询状态是否完成。



作者:zhanglbjames
链接:https://www.jianshu.com/p/385df6faf585
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值