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

带你认识3个J.U.C组件扩展

带你认识3个J.U.C组件扩展

一文带你了解J.U.C的FutureTaskFork/Join框架和BlockingQueue

一文带你了解J.U.C的FutureTaskFork/Join框架和BlockingQueue