Callable、Runnable,Future和FutureTask之间关系

创建线程的两种方式:继承Thread类 或 实现Runnable接口,重写run方法。

Thread类本身也实现了Runnable接口,Runnable接口源码:

Callable、Runnable,Future和FutureTask之间关系

run方法是无返回值的,所以在JDK1.5出现了Callable接口


 关系类图

Callable、Runnable,Future和FutureTask之间关系


Callable

Callable接口源码

Callable、Runnable,Future和FutureTask之间关系

Callable是一个函数式接口(接口中仅有一个方法),也是一个泛型接口,返回值类型和泛型一致


Future

Future接口源码

Callable、Runnable,Future和FutureTask之间关系

cancel:取消任务的执行,如果任务已完成或已被取消,则返回false

isCancelled:判断任务是否被取消

isDone:判断任务是否完成

get():阻塞获取任务的执行结果

get(long timeout, TimeUnit unit):在规定的时间内,阻塞获取任务的执行结果;如果在规定的时间内未获取到结果,则抛出TimeoutException

Future接口提供了取消任务,任务状态查询,任务结果获取的能力;

Future机制就是为了解决多线程返回值的问题;


RunnableFuture

RunnableFuture接口源码

Callable、Runnable,Future和FutureTask之间关系

RunnableFuture继承了Runnable和Future两个接口,也就同时具备其两个接口的功能


FutureTask

FutureTask是真正工作的处理类,实现了RunnableFuture接口,而RunnableFuture接口继承了Runnable和Future接口,所以FutureTask既可以作为Runnable被Thread执行,也可以获取Future异步执行的结果;

FutureTask两个构造方法,一个接收Callable的参数实例,另一个接收Runnable的参数实例

Callable、Runnable,Future和FutureTask之间关系

 Callable、Runnable,Future和FutureTask之间关系

 Callable、Runnable,Future和FutureTask之间关系

 当传入的参数是Runnable时,通过Executors.callable(runnable, result)方法将其转成Callable类型,返回值类型为V(指定的泛型类型)

 

上一篇:线程详解


下一篇:多线程-Callable