Future的理解

public interface Future{

boolean cancel(boolean mayInterruptIfRunning);

boolean isCancelled();

boolean isDone();

V get() throws InterruptedException, ExecutionException;

V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;

}

Future的实现类FutureTask特点:回调函数done()方法,当一个任务执行结束后,会回调这个done()方法,我们可以在done()方法中调用FutureTask的get()方法来获得计算的结果。在其他时候get()会阻塞我的UI线程。

局限性:                                                                                                                                                                    Future:主要是获取任务执行结果和对异步任务的控制。1、但是如果是批量任务的话,获取执行结果很麻烦。因为不知道哪一个任务先完成,得不停的遍历查询。2、也因为Future.get是阻塞方法,使用不当会造成线程浪费。

解决方法:

1、批量任务中查询已完成任务,可以使用completionService,它提供了一个take()阻塞方法,用来获取所有已完成的任务。

2、对于第二个问题,可以用 Google Guava 库所提供的 ListeningExecutorService 和 ListenableFuture 来解决。ListenableFuture可以允许注册回调方法(callbacks),在运算(多线程执行)完成的时候进行调用,  或者在运算(多线程执行)完成后立即执行。

Future 在高并发环境下有可能重复提交任务的,所以需要FutureTask阻止这种情况发生,保证只会执行一次。将FutureTask放入map之中,用键值对保存。

FutureTask是一个RunnableFuture,继承Runnable、future,所以FutureTask可以提交给 Executor执行也可以由调用线程直接执行FutureTask.run()方法。FutureTask的run()方法中又会调用Callable的call()方法。

那为什么FutureTask还要继承Runnable呢?                                                                                                      Callable与Runnable:描述的都是抽象的计算任务。Runnable有局限性,虽然能将结果写入日志文件或者某个方式共享数据结构,但是不能返回一个值或者抛出异常;Callable是对Runnable局限性的弥补。

public interface RunnableFuture extends Runnable, Future{

}

private volatile intstate;

private static final intNEW=0;新建

private static final intCOMPLETING=1;执行中

private static final intNORMAL=2;正常

private static final intEXCEPTIONAL=3;异常

private static final intCANCELLED=4;取消

private static final intINTERRUPTING=5;中断中

private static final intINTERRUPTED=6;被中断

state的状态变化可以有四种方式

NEW->COMPLETING->NORMAL                            正常完成的流程

NEW->COMPLETING->EXCEPTIONAL                出现异常的流程

NEW->CANCELED                                                  被取消

NEW->INTERRUNPING->INTERRRUNPTED        被中断

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android Handler机制系列文章整体内容如下: Android Handler机制1之ThreadAnd...
    隔壁老李头阅读 4,407评论 2 12
  • 一.线程安全性 线程安全是建立在对于对象状态访问操作进行管理,特别是对共享的与可变的状态的访问 解释下上面的话: ...
    黄大大吃不胖阅读 941评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,465评论 19 139
  • 前方高能预警,距离负能量50米……10米……1米,措手不及。 聪慧总觉得生活没啥好烦恼的,就快毕业答辩,论文没动,...
    辣妹事多店阅读 394评论 0 0
  • 文/宁汐染 遇到他那年,她正是豆蔻年华 许是那湖畔的匆匆一暼,自此牵动芳心 西湖之上,杨柳依依,烟波浩淼 画舫之间...
    宁汐染阅读 455评论 0 8

友情链接更多精彩内容