JDK1.5之前,我们创建线程有这样两种方式
1.继承Thread类
2.连接实现Runnable接口
但是这两个方法我们都没有返回值,如果需要获取任务返回结果怎么办?
然后在JDK1.5之后,官方就提供了Callable和Future,有获取任务返回结果的方法
ps:我们的Thread类本身也实现了Runnable接口
Runnable接口
我们这个接口有一个run方法,我们的返回值是void类型
Callable接口
有返回值
可以抛出异常
Future接口
Future是用来做我们的异步的
我主要有这4个功能
他的功能比Runnable,Callable丰富
取消任务 cancel()
判断任务是否被取消 isCancellde()
判断任务是否执行完成 isDone()
获取任务执行结果 get()
简单理解就是:
我有一个任务,提交给了 Future
来处理。
任务执行期间我自己可以去做任何想做的事情 。并且,在这期间我还可以取消任务以及获取任务的执行状态 。一段时间之后,我就可以 Future
那里直接取出任务执行结果。
FutureTask类来进行进一步理解
我们的FutureTask实现了我们的Runnable接口和我们的Future接口
FutureTask内部可传入Callable或者Runnable对象
传入的Runnable对象会在方法内部转换为Callable对象
FutureTask相当于对Callable进行了封装,管理着任务执行的结果,存储了Callable的call方法的任务执行结果
FutureTask让我们既可以作为一个Runnable被Thread执行,也可以获取Future异步计算得到的结果