Future机制
1 为什么出现Future机制
常见的两种创建线程的方式。一种是直接继承Thread,另外一种就是实现Runnable接口。
这两种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。
从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。
Future模式的核心思想是能够让主线程将原来需要同步等待的这段时间用来做其他的事情。
因为可以异步获得执行结果,所以不用一直同步等待去获得执行结果。
2 Future结构
类图:
2.1 Future接口
Future接口用于对具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。
必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果。
通过接口的定义,可以看到实现Future接口的子类会具有这些行为:
-
可以取消这个执行逻辑,如果这个逻辑已经正在执行,提供可选的参数来控制是否取消已经正在执行的逻辑。
-
可以判断执行逻辑是否已经被取消。
-
可以判断执行逻辑是否已经执行完成。
-
可以获取执行逻辑的执行结果。
-
可以允许在一定时间内去等待获取执行结果,如果超过这个时间,抛
TimeoutException
。
2.2 FutureTask类
FutureTask是Future的具体实现。
FutureTask
实现了RunnableFuture
接口。RunnableFuture
接口又同时继承了Future
和 Runnable
接口。
所以FutureTask
既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值。
FutureTask<Integer> task = new FutureTask<>(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
Thread.sleep(3000);
return 5;
}
});
new Thread(task).start();
//task.get()
//。...