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

FutureTask

时间:2017-09-12 15:58:36      阅读:268      评论:0      收藏:0      [点我收藏+]

标签:nis   接口实现   ==   get   exec   取消   ini   有一个   obj   

通过实现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

标签:nis   接口实现   ==   get   exec   取消   ini   有一个   obj   

原文地址:http://www.cnblogs.com/chuliang/p/7509624.html

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