Callable 接口和 Future 接口简介
执行器框架允许编程人员执行并发任务而无须创建和管理线程。
可以创建任务并将其发送给执行器,而执行器负责创建和管理所需的线程。
在执行器中,你可以执行两种任务。
-
基于 Runnable 接口的任务:
这些任务实现了不返回任何结果的 run() 方法。 -
基于 Callable 接口的任务:
这些任务实现了返回某个对象作为结果的 call() 接口。
call()方法返回的具体类型由 Callable 接口的泛型参数指定。
为了获取该任务返回的结果,执行器会为每个任务返回一个 Future 接口的实现。
Callable 接口
Callable 接口是一个与 Runnable 接口非常相似的接口。
Callable 接口的主要特征如下:
-
Callable 接口是一个通用接口。
它有一个简单类型参数,与 call() 方法的返回类型相对应。 - Callable 接口声明了 call() 方法。
执行器运行任务时,该方法会被执行器执行。它必须返回声明中指定类型的对象。 - Callable 接口的 call() 方法可以抛出任何一种校验异常。
你可以实现自己的执行器并重载 afterExecute() 方法来处理这些异常。
Future 接口
当向执行器发送一个 Callable 任务时,它将为你返回一个 Future 接口的实现,这允许你控制任务的执行和任务状态,使你能够获取结果。
该接口的主要特征如下。
-
可以使用 cancel() 方法来撤销任务的执行。
该方法有一个布尔型参数,用于指定是否需要在任务运行期间中断任务。 - 可以校验任务是否已被撤销(采用 isCancelled() 方法)或者是否已经结束(采用 isDone()方法)。
- 可以使用 get() 方法获取任务返回的值。
该方法有两个变体。- 第一个变体不带有参数,当任务完成执行后,该变体将返回任务所返回的值。
如果任务并没有完成执行,它将挂起执行线程直到任务执行完毕。 - 第二个变体带有两个参数:时间周期和该周期的 TimeUnit (时间单位)。
该变体与第一个变体的区别在于将线程等待的时间周期作为参数来传递。
如果这一周期结束后任务仍未结束执行,该方法就会抛出一个 TimeoutException 异常。
- 第一个变体不带有参数,当任务完成执行后,该变体将返回任务所返回的值。