创建线程的两种方式:继承Thread类 或 实现Runnable接口,重写run方法。
Thread类本身也实现了Runnable接口,Runnable接口源码:
run方法是无返回值的,所以在JDK1.5出现了Callable接口
关系类图
Callable
Callable接口源码
Callable是一个函数式接口(接口中仅有一个方法),也是一个泛型接口,返回值类型和泛型一致
Future
Future接口源码
cancel:取消任务的执行,如果任务已完成或已被取消,则返回false
isCancelled:判断任务是否被取消
isDone:判断任务是否完成
get():阻塞获取任务的执行结果
get(long timeout, TimeUnit unit):在规定的时间内,阻塞获取任务的执行结果;如果在规定的时间内未获取到结果,则抛出TimeoutException
Future接口提供了取消任务,任务状态查询,任务结果获取的能力;
Future机制就是为了解决多线程返回值的问题;
RunnableFuture
RunnableFuture接口源码
RunnableFuture继承了Runnable和Future两个接口,也就同时具备其两个接口的功能
FutureTask
FutureTask是真正工作的处理类,实现了RunnableFuture接口,而RunnableFuture接口继承了Runnable和Future接口,所以FutureTask既可以作为Runnable被Thread执行,也可以获取Future异步执行的结果;
FutureTask两个构造方法,一个接收Callable的参数实例,另一个接收Runnable的参数实例
当传入的参数是Runnable时,通过Executors.callable(runnable, result)方法将其转成Callable类型,返回值类型为V(指定的泛型类型)