多线程任务类,Runnable、Callable、Future、Runnable和FutureTask的关系

引言

多线程开发中,我们经常会遇到Runnable、Callable、Future、Runnable和FutureTask,今天就把这些接口和类的关系来理清楚。

类图关系

多线程任务类,Runnable、Callable、Future、Runnable和FutureTask的关系_第1张图片
类图的基本关系

大致画了下类图,箭头元素不是很标准的UML类图元素,用在线工具画的,做了些文字说明,见谅见谅。
图中可以很清晰的看到,RunnableFuture继承了Runnable、Future接口,FutureTask实现了RunnableFuture接口,同时构造函数依赖了Callable接口。

各类方法介绍

Runnable很简单,只有一个run()方法,任务在run()方法中执行。
Future类:

  1. cancel(mayInterruptIfRunning),用于中断取消任务,参数表示是否允许中断正在执行的任务。
  2. isCancelled(),任务是否被中断取消。任务在正常完成前取消,返回为true。
  3. isDone(), 任务是否已经结束,需要注意的是如果任务正常终止、异常或取消,都将返回true。
  4. get(),这是一个异步方法,等任务执行完后,返回的结果。其中抛出了 InterruptedException 任务中断异常, ExecutionException任务执行的异常等异常,如果任务被取消还会抛出CancellationException取消任务的异常。
  5. get(timeout, unit),同get()方法一样,但是可以设置任务执行获取执行结果的超时时长。

RunnableFuture:接口继承了Runnable、Future等接口。
Callable:接口内部就声明了一个call()方法,返回了任务执行的结果对象。
FutureTask类实现了RunnableFuture接口,集成了Runnable、Future接口的方法功能,同时构造函数依赖了Callable接口。FutureTask在高并发的情况下,能确保run()方法只执行一次,下面会对其源码做分析。

分析FutureTask的源码实现

你可能感兴趣的:(多线程任务类,Runnable、Callable、Future、Runnable和FutureTask的关系)