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】。文章转载请联系作者。
评论