为什么要使用Future?
这个要从Runnable接口说起。

runnable接口里只有一个抽象方法,run方法返回类型是void,无法得到执行后的结果。
但在实际开发中如果想要获取最终的结果时Runnable接口就不适合了,那么获取结果怎么实现呢?Callable类可以有返回值。
Future是对具体的runnable和callable任务的结果进行查询、取消、是否完成、获取结果。它的get方法通过阻塞进程获取返回结果。

如何使用Future接口呢?
ExecutorService接口中有3个方法,可以将callable,runnable,future联系起来。

请下看面的例子:

Future是个接口,无法创建对象,那么就有了FutureTask类。它实现了Future和Runnable接口。简单的总结,它可以使用
new Thread(Runnable b) 放在一个新的线程中执行,也可以使用executorService.submit(Runnable b)放在线程池中执行,两种方式都可以得到返回值。

具体使用的例子:

网友评论