引言
多线程开发中,我们经常会遇到Runnable、Callable、Future、Runnable和FutureTask,今天就把这些接口和类的关系来理清楚。
类图关系
类图的基本关系
大致画了下类图,箭头元素不是很标准的UML类图元素,用在线工具画的,做了些文字说明,见谅见谅。
图中可以很清晰的看到,RunnableFuture继承了Runnable、Future接口,FutureTask实现了RunnableFuture接口,同时构造函数依赖了Callable接口。
各类方法介绍
Runnable很简单,只有一个run()方法,任务在run()方法中执行。
Future类:
- cancel(mayInterruptIfRunning),用于中断取消任务,参数表示是否允许中断正在执行的任务。
- isCancelled(),任务是否被中断取消。任务在正常完成前取消,返回为true。
- isDone(), 任务是否已经结束,需要注意的是如果任务正常终止、异常或取消,都将返回true。
- get(),这是一个异步方法,等任务执行完后,返回的结果。其中抛出了 InterruptedException 任务中断异常, ExecutionException任务执行的异常等异常,如果任务被取消还会抛出CancellationException取消任务的异常。
- get(timeout, unit),同get()方法一样,但是可以设置任务执行获取执行结果的超时时长。
RunnableFuture:接口继承了Runnable、Future等接口。
Callable:接口内部就声明了一个call()方法,返回了任务执行的结果对象。
FutureTask类实现了RunnableFuture接口,集成了Runnable、Future接口的方法功能,同时构造函数依赖了Callable接口。FutureTask在高并发的情况下,能确保run()方法只执行一次,下面会对其源码做分析。