Java 多线程 Future 和 FutureTask 的区别
一、说明
Future 和 FutureTask 的关系
Future 是一个接口,无法直接创建对象,需配合线程池使用
.submit()方法返回值Future来保存执行结果;而使用.execute()方法传入Runnable接口无返回值FutureTask 是一个类,可以直接创建对象,其实现了
RunnableFuture接口(继承Future接口)
使用区别
就是一个接口和实现类的不同写法
二、理解
Future
java.util.concurrent包下Future<V>接口,对Runnable或Callable对象执行任务完成后获取执行结果
mayInterruptRunning表示是否中断执行中的线程boolean cancel()尝试取消任务的执行,如果任务已经完成或已被取消,则返回 false;如果任务已经启动,将以中断执行线程的方式停止该任务,停止成功则返回 trueboolean isDone()若任务完成,则返回 trueboolean isCancelled()若任务在完成前取消,则返回 trueget()获取执行结果,必须等待任务完成后才返回结果get(long timeout, TimeUnit unit)获取执行结果,timeout 表示等待的最长时间,unit 表示时间单位,在指定时间内还没获取到结果,则返回 null
FutureTask
java.util.concurrent包下实现RunnableFuture<V>接口,可实现Runnable接口执行线程,也可实现Future接口获取执行结果
RunnableFuture接口继承Runnable
FutureTask 执行状态
根据方法执行的时机,FutureTask 可处于以下三种行状态
FutureTask 方法执行示意图
.cancel(ture)会中断线程停止任务,适用于长时间处于运行的任务,并且能够处理 interruption.cancel(false)会让线程正常执行至完成,并返回 false,适用于未能处理 interruption 的任务,或者不清楚是否支持取消的任务,以及等待已经开始的任务执行完成
三、实现
1.实现接口
创建CallableThreadDemo类实现Callable接口
2.使用 Future
创建CallableTest类执行测试,将创建好的线程对象通过.submit()方法提交到线程池去执行,线程执行后,返回值Future可被拿到
3.使用 FutureTask
创建FutureTask对象,提交任务到线程池,可以交给Executor执行,或将创建好的线程对象通过.submit()方法提交到线程池去执行,线程执行后,返回值FutureTask可被拿到
版权声明: 本文为 InfoQ 作者【Yeats_Liao】的原创文章。
原文链接:【http://xie.infoq.cn/article/54e25e5386c9a5a012502d7b3】。文章转载请联系作者。










评论