使用Future

Runnable接口有个问题,它的方法没有返回值。如果任务需要一个返回结果,那么只能保存到变量,还要提供额外的方法读取,非常不便。所以,Java标准库还提供了一个Callable接口,和Runnable接口比,它多了一个返回值:

并且Callable接口是一个泛型接口,可以返回指定类型的结果。

如果仔细看ExecutorService.submit()方法,可以看到,它返回了一个Future类型,一个类型的实例代表一个未来能获取结果的对象:

当我们提交一个Callable任务后,我们会同时获得一个Future对象,然后,我们在主线程某个时刻调用Future对象的get()方法,就可以获得异步执行的结果。在调用get()时,如果异步任务已经完成,我们就直接获得结果。如果异步任务还没有完成,那么get()会阻塞,直到任务完成后才返回结果。

  • get(long timeout, TimeUnit unit):获取结果,但只等待指定的时间;
  • isDone():判断任务是否已完成。

下载练习: (推荐使用IDE练习插件快速下载)

对线程池提交一个Callable任务,可以获得一个Future对象;

使用Future - 图1