FutureTask
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FutureTask相关的知识,希望对你有一定的参考价值。
通过实现runnableFuture接口实现两个接口:
future和runnable
future是一个接受任务的接口
里面有方法 cancel,取消任务
get()无参数的方法等待任务执行结束,获取任务的返回结果(泛型)
带参数的方法,等待一定时间,如果还没返回结果,抛出异常
iscancelled 和 isDone方法检测,是否取消任务和是否完成(包括正常终止,异常,取消)
内部有一个volatile 的state字段,用来作为全局变量。
从0到6的7个状态
一个接受callable类型的引用
一个Object类型的outcome(返回值)
一个线程引用
一个node类引用
report()根据传入状态返回结果
两个重载的构造方法:传入callable参数的很好理解,里面的call方法就是要执行的任务,call方法的返回值,到时候赋值给outcome,等待返回
传入runnable和result的,是用一个executor的内部类,适配器模式,call方法中又调用callble接口实现类的run方法
先看run方法,先判断状态是否是new 0 ,以及将当前线程引用是不是null,cas置换成当前线程是否成功,不成功直接返回,执行callable实现类的call方法,如果成功执行,不抛出异常的情况下,call的结果值赋值给outcome
第二重要的是awaitDone方法,这个方法是等待线程run方法结束,之后再获取结果,在get()方法中扮演重要地位,
awaitDone方法是个for循环,获取state,一般在run方法之后调取get,run方法最后阶段会调用set方法,然后把state设置为2,所以进来之后,
如果run方法执行完了,那么进入第一个if,q.thread为null,把2返回
正常的判断是,在futureTask构造的时候,state是new 0的,进来之后,q==null所以先赋值new waitnode,赋值的时候,会把当前thread对象传递给node里的thread引用,
第二轮,进入!queued,将waiters的waitnode对象替换成q,并且把q的next指针指向waitnode对象,当然也可以为null,开始的时候。
第三轮,因为已经把当前对象加入等待队列里了,所以可以将当前线程park掉,停掉,这个无限期停止的恢复,是在set方法中,有一个finishCompletion()方法, 恢复所有挂起线程。
以上是关于FutureTask的主要内容,如果未能解决你的问题,请参考以下文章
并发容器J.U.C --组件FutureTaskForkJoinBlockingQueue